Pergunta

Eu quero carregar e, em seguida, processar um arquivo em um aplicativo Ruby on Rails. O upload do arquivo é geralmente bastante curto, mas o processamento do lado do servidor pode demorar algum tempo (mais de 20 segundos) então eu quero dar ao usuário algum indicador -. Algo melhor do que um sentido 'tratamento ...' tela

Eu estou tentando usar o seguinte código na vista

<%= periodically_call_remote(:url => {:action => 'progress_monitor', :controller => 'files'},
                 :frequency => '5',
                 :update => "setProgress('progressBar','5')"
                 ) %>

O conteúdo do parâmetro: atualização é o javascript Eu quero correr a cada 5 segundos

e o seguinte código está nos arquivos do controlador

def progress_monitor
  render :text => 'whatever'
end

Finalmente, o método progress_monitor retornará o progresso atual como um inteiro (% concluído) e que será passado para o código 'setProgress' JavaScript (que irá atualizar um no elemento da tela)

No entanto, eu estou lutando para obter uma resposta correcta a partir do servidor que pode ser passado para JavaScript.

alguém pode ajudar, ou eu estou abordando este o caminho errado?

Há um acompanhamento pergunta a isso, eu originalmente atualizou esta pergunta, mas a atualização foi suficientemente diferente para justificar uma nova pergunta, aqui .

Foi útil?

Solução

periodically_call_remote() atualiza um div. Não vai chamar sua função JavaScript. Eu não sou nenhum guru JavaScript, mas para resolver o seu problema, você deve fazer sua própria chamada xmlhttp. Se eu fosse você, eu usaria pedido AJAX do protótipo

http://www.prototypejs.org/api/ajax/request

setTimeout

e o uso de JavaScript ou setInterval para fazer o polling periódica

http://www.elated.com/ artigos / javascript-timers-com-setTimeout-and-setInterval /

espero que isso ajude cos na verdade eu encontrei o mesmo prb também =)

Outras dicas

A opção :update só deve listar o div que você deseja atualizar, não tem Javascript que você deseja avaliar.

Os ajudantes de Rails ainda são muito boas para esta situação, não há necessidade de escrever muito JS personalizados. Se você deseja executar JS no retorno, uma maneira fácil seria para tornar um modelo RJS. Se você deseja fazê-lo com HTML puro, simplesmente renderizar uma visão (ou parcial, ou retornar diretamente a partir do método render com o HTML da barra de progresso) e colocar a div da barra de progresso na opção :update do método periodically_call_remote.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top