読者です 読者をやめる 読者になる 読者になる

Rails Webook

自社のECを開発している会社で働いています。Rails情報やサービスを成長させる方法を書いていきます

Rails4での基本的なセッションの使い方

Rails初級 Rails Controller

Rails4では、デフォルトでセッション情報はブラウザのクッキーに保存されます。
そして、コントローラーでsessionインスタンスを使うことで、セッションに値を設定/取得といったアクセスができます。

動作確認

  • Rails 4.1

目次

  1. セッションに値を設定
  2. セッションから値を取得
  3. セッションを削除する
  4. セッションを使うときの3つの注意点


1. セッションに値を設定

次のように、コントローラー内からsessionインスタンスにハッシュのようにアクセスすることが可能です。

# app/controllers/logins_controller.rb
class LoginsController < ApplicationController
  # ログインする
  def create
    if user = User.authenticate(params[:username], params[:password])
      # ユーザーIDをセッションに保存する
      session[:user_id] = user.id
      redirect_to root_url
    end
  end
end


2. セッションから値を取得

次のように、設定した値を、セッションから値を取得することも可能です。

# app/controllers/application_controller.rb
class ApplicationController < ActionController::Base

  private
    # 現在のユーザーを取得する
    # @_current_userが空の場合は、session情報をキーにしてDBから検索する
    def current_user
      @_current_user ||= User.find_by(id: session[:user_id])
    end
end


3. セッションを削除する

設定したセッションから値を削除するには、nilを設定します。

# app/controllers/logins_controller.rb
class LoginsController < ApplicationController
  # ログアウトする
  def destroy
    # @_current_userとsession[:user_id]の値をnilにする
    @_current_user = session[:user_id] = nil
    redirect_to root_url
  end
end


すべてのセッション情報を削除したい場合は、reset_sessionを使います。

# app/controllers/logins_controller.rb
class LoginsController < ApplicationController
  # ログアウトする
  def destroy
    # @_current_userの値をnilにする
    @_current_user = nil
    reset_session
    redirect_to root_url
  end
end


4. セッションを使うときの3つの注意点

1. 秘密情報を保持しない
デフォルトのセッションデータはクッキーに保存されます。そのため、改ざん防止機構はついていますが、内容を確認することができてしまうため、秘密譲歩は表示しないようにしましょう。

2. 巨大なオブジェクトは入れられない
クッキーの制限に、4KB弱という容量制限があります。そのため、巨大なオブジェクトは入れられません。
ちなみに、Railsのセッションの使われ方として、セッションに入れるデータはユーザーのIDとflash程度にとどめるのが推奨されています。

3. マージャルできないオブジェクトは入れられない
セッションにデータを格納すると、保存対象のオブジェクトはMarshal#dumpによってシリアライズされて保存されます。
これは、IOオブジェクトやProcオブジェクトなど、シリアライズできないオブジェクトはセッションに格納することができないという意味です。


以上です。

DBにセッション情報を格納したい場合は、rails/activerecord-session_store · GitHubというgemの利用を検討してください。

参考文献