ajax版できたよー
前回→railsサーバアプリ⇔ブラウザの同期 - スキマハコからの続き。
TODOのうち、以下のものを消化!
- jqueryでの自動更新
- リモート・フォームの送信の方法
- application.rb
# JavaScript files you want as :defaults (application.js is always included). # config.action_view.javascript_expansions[:defaults] = %w(jquery rails) # とりあえず、[jquery]→[rails.js]→[application.js]の順で読み込んでもらうー。 # 既存にあるprototype.jsなどは消してません。 config.action_view.javascript_expansions[:defaults] = %w(jquery.min rails)
- application.js
sessionが維持できなくて苦労しました…。
参考にさせていただいたところ→AjaxのPOSTでsessionが取得できない - 屑プログラマの憂鬱
function method(page){ // setIntervalの識別ID var intervalid = 0; $.ajax({ url: $(page).attr('action'), type: 'POST', dataType: 'html', timeout: 1000, data : $(page).serialize(), beforeSend: function(xhr) { // sessionの引き継ぎ xhr.setRequestHeader('X-CSRF-Token', $('meta[name="csrf-token"]').attr('content')); $('#result').html('送信中...').fadeIn(200); }, error: function(){ $('#result').html('送信失敗!'); }, success: function(){ // setIntervalの識別ID取得 intervalid = setInterval(function() { $('#result').load("control/resultdata"); }, 1000); // Intervalの終了処理タイムアウト設定 // コントローラのresultdataよりも長めにとっとく。 setTimeout(function(){ clearInterval(intervalid); },30000); } }); return false; }
- view
<% form_for 'test_action',:html => {:onsubmit => "return method(this);"} do |f|%> <%= f.text_area :body, 'cols' => 40, 'rows' => 5 %> <div> <%= f.submit "送信", :name => "send" %> <%= tag :input,:type=>'reset',:value=> "クリア" %> <%= tag :input,:type=>'button',:value=> "終了", :onclick=>"window.open('about:blank','_top').close();" %> </div> <% end %> </div> <div id='result'> </div>
- controller
def test_action # セッションに追加 session[:flag] = "フラグが立った!" session[:time] = Time.now.utc.to_i p session end def resultdata # 直接アクセスの場合、404にリダイレクト return redirect_to '/404.html' unless request.xhr? p session # さあチェックだ! if session[:flag]!=nil # なにかしらの処理。ファイルチェックとか? if (処理結果) == true session[:result] = "OK!" else # タイムアウトチェック difftime = (Time.now.utc.to_i - session[:time].to_i) # タイムアウト(10秒) if difftime > 10 session[:flag] = nil session[:time] = nil session[:result] = "タイムアウトです。" + difftime.to_s + "秒" else session[:result] = "経過秒" + difftime.to_s + "秒" end end end # html出力〜 render :text=>session[:result] end
あ、自動読み込みの場所はroutes.rbの設定をしないとつながらないかも。
問題点
Ajaxてきな、頻度高すぎるとサーバには負荷がかかるー。