Atualizando o progresso do lado do servidor na aplicação Rails
-
02-07-2019 - |
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 ??p>
<%= 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 .
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
setTimeoute 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
.