同時に消えて欲しいのです。

Railsは遅い。というより、静的なHTMLなりなんなりを単に送り返すより動的に内容を作って送り返す形だとRailsに限らずなんだって遅いのは当然。
だから、ページキャッシュを多用すれば高速なアプリケーションが作れる。ただし、困るのがユーザーに合わせた内容を表示したいとき。「ようこそyune_kotomiさん」って言う、アレ。


これをなんとかする手法はいくつかあって、今回試しているのが次の手法。
現実の世界の Rails、第 2 回:高度なページ・キャッシング
Cookieにユーザー情報を書き込んでおいて、クライアントサイドでJSを使って「ようこそ〜」を描画する。

この手法を用いる場合、注意しなければいけないのがCookieの寿命管理。Railsが使っているセッション格納用のCookieとは別のCookieを使ってユーザー情報を描くから、両者の有効期限が異なっている場合は困ったことになる。「ようこそ〜」って出てるのに実はセッションの有効期限切れてるとか、逆にゲスト扱いされてるのにログイン状態が継続してるとか。


セッションの有効期限を指定するのにポピュラーなのは、Application Controllerでbefore_filterを定義して、各アクション実行時に期限を延長する手法。

  before_filter :reset_session_expires
  def reset_session_expires
    ::ActionController::CgiRequest::DEFAULT_SESSION_OPTIONS.update(
      :session_expires => 1.week.from_now 
    )
  end
  protected :reset_session_expires

これで、セッションの有効期限は1週間後になる。これやってくれるプラグインもありますね。
さて、JSでユーザ情報を描くために、ユーザー情報を書き込んだ別のCookieを作る必要があるので、次のようなafter_filterを定義。

  after_filter :set_userdata_cookie
  def set_userdata_cookie
    #セッションの有効期限
    expires_at = session.instance_variable_get(:@dbman).instance_variable_get(:@cookie_options)['expires']
    
    if session[:domain_name] == nil
      #ログアウト済み、もしくはゲスト
      cookies.delete :kotoen_userdata
      
    else
      #ログイン中
      cookies[:kotoen_userdata] = {
        :value => ({
          :domain_name => session[:domain_name], 
          :screen_name => session[:screen_name]
        }).to_json, 
        :expires => expires_at
      }
    end
  end
  protected :set_userdata_cookie

これで、sessionの内容に同期したCookieが自動で生成・破棄されるようになった。セッションの有効期限取得部分がかなり怪しい雰囲気。もっと簡潔に取れないものかな。