Rails3.x系でログイン状態を保持する方法

Rails3.xだとデフォルトのsessionの有効期限はブラウザを終了したらなくなります.
でも,1ヶ月とかにしたいですよね.今回はその設定方法をメモ.

よくあるパターンとして,
1. ログインしたら自動的に1ヶ月程度sessionを保存する
2. ログインを保存ボタンを設けて,ログインを保存ボタンを押した場合だけ指定期間保存する.

まずは1の方法から,これはinitializers/session_store.rbに以下の設定を追記する.

Yourapp::Application.config.session_store :cookie_store,
   :key => '_yourapp_session',
   :expire_after => 1.months

これでsessionが最後に更新されてから1ヶ月はブラウザを終了してもsessionが保存されます.

次に2の方法.

sessionのexpireは,request.session_options[:expire_after]で管理されてます.
ただしrequestオブジェクトはrequest毎に作られるので,毎回これを更新する必要があります.
更新しないとデフォルト値(nil)が挿入されます.

login時にkeep_login項目を作っておいてそれがonの場合はsessionを1ヶ月保存する.とした時

account_controller.rb

def login
  #ログイン処理とかは省略
  (snip)
  if params[:keep_login] == "on"
    request.session_options[:expire_after] = 1.months.from_now
    session[:user_persistent] = Time.now
  end
  (snip)
end

application_controller.rb

before_filter :set_user

def set_user                                                                                             
  if session[:user]                                                                                      
    if session[:user_persistent]                                                                         
      request.session_options[:expire_after] = 1.months.from_now                                         
      session[:user_persistent] = Time.now                                                               
    end                                                                                                  
                                                                                                         
    @user = User.find(session[:user])                           
  end                                                                                                    
end   

これで,最終アクセス時から1ヶ月間は保存されます.
軽くググッたけれどもそれっぽい情報がなかったんで自分で考えてやったんですが,
なにかしら他のスタンダードな方法があれば教えて下さい!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です


*

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>