スキマハコ

わすれがちなスキマな事を詰め込んでいます。ITの他に暮らしについても書いています。

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てきな、頻度高すぎるとサーバには負荷がかかるー。