periodically_call_remoteとuser_engineの組合せの問題

フラッシュメーッセージを一定時間表示して非表示にするようにしたところ、不思議な現象が発生していた。アクセス権のないアクションを実行しようとすると、常にcheck_flash_timerアクションへ、リダイレクトしてしまう。通常は、user_engineによって、直前のアクションへリダイレクトするようになっていると思っていたのだが、不思議な現象だ。
調べていくうちに、ページ全体を読み込んでから、最初の10秒間だけは期待通りの動作で、それ以降は常にcheck_flash_timerへのリダイレクトになってしまうことが判明。10秒間というのは、フラッシュメッセージが消えるまでの時間だ。どうやら、理由は分からないが、periodically_call_remoteでアクションが呼び出されると、user_engineはそのアクションを最新と認識してしまうようだ。(link_to_remoteでアクションを呼び出して処理しても上記のような現象は発生しないのに...。)
periodically_call_remoteとuser_engineを組合せた時は、何らかの対策が必要になる。以下のようにやってみた。

app/controllers/csvs_controller.rb
コントローラー
  • if request.xhr?によって、ajaxリクエストかどうかを判定し...
    • ajaxリクエストならビジュアルエフェクトを処理する。
    • そうでなければ、listアクションへリダイレクトする。
class CsvsController < ApplicationController
...(途中省略)...
  def check_flash_timer
    if request.xhr?
      render :update do |p|
        p.visual_effect(:DropOut, 'flash', :duration => 2)
      end
    else
      redirect_to :action=>'list'
    end
  end
...(途中省略)...


んー、あまり良い方法ではない。そもそも、user_engineがperiodically_call_remoteで呼び出されるアクションを無視してくれるようになれば良いのだが...。その方法が思いつかない。以上、とりあえずの回避。