Rails アプリケーションのサーバー側の進行状況を更新する
-
02-07-2019 - |
質問
Ruby on Rails アプリでファイルをアップロードして処理したいと考えています。ファイルのアップロードは通常非常に短いですが、サーバー側の処理には時間がかかる場合があります (20 秒以上)。そのため、意味のない「処理中...」画面よりも適切なインジケーターをユーザーに提供したいと考えています。
ビューで次のコードを使用しようとしています
<%= periodically_call_remote(:url => {:action => 'progress_monitor', :controller => 'files'},
:frequency => '5',
:update => "setProgress('progressBar','5')"
) %>
:update パラメータの内容は、5 秒ごとに実行したい JavaScript です。
次のコードはファイルコントローラーにあります
def progress_monitor
render :text => 'whatever'
end
最終的に、progress_monitor メソッドは現在の進行状況を整数 (% 完了) として返し、それが「setProgress」JavaScript コードに渡されます (画面上の要素を更新します)。
ただし、サーバーから JavaScript に渡すことができる正しい応答を取得するのに苦労しています。
誰か助けてくれませんか?それとも私は間違った方法でこれに取り組んでいますか?
これにはフォローアップの質問があります。最初にこの質問を更新しましたが、更新は新しい質問を正当化するのに十分な違いがありました。 ここ.
解決
periodically_call_remote()
を更新します div
. 。JavaScript 関数は呼び出されません。私は JavaScript の専門家ではありませんが、問題を解決するには、自分で解決する必要があります。 xmlhttp
電話。私だったら、プロトタイプの AJAX リクエストを使用します
http://www.prototypejs.org/api/ajax/request
JavaScript の settimeout または setinterval を使用して定期的なポーリングを実行します。
http://www.elated.com/articles/javascript-timers-with-settimeout-and-setinterval/
実際に私も同じ状況に遭遇したことがあるので、これが役立つことを願っています =)
他のヒント
の :update
オプションでは、更新したい div のみをリストする必要があり、評価したい Javascript は含めるべきではありません。
Rails ヘルパーはこの状況でも非常に優れており、多くのカスタム JS を記述する必要はありません。戻り時に JS を実行したい場合、RJS テンプレートをレンダリングするのが簡単な方法です。純粋な HTML でこれを実行したい場合は、単にビュー (または部分的) をレンダリングするか、ビューから直接返します。 render
メソッドをプログレスバーの HTML で作成し、プログレスバーの div を :update
のオプション periodically_call_remote
方法。