基本

Ruby on Railsのセッション管理の使い方

Ruby on Railsのセッションは、ユーザーごとのデータをリクエストをまたいで保持するための仕組みです。ログイン状態の管理やショッピングカートの保持など、Webアプリケーションでステートフルな操作を実現するために欠かせない機能です。この記事では、セッションの基本的な使い方から設定方法まで解説します。

基本的な使い方

セッションにデータを保存するには、sessionハッシュを使います。コントローラー内でキーと値のペアを設定するだけです。

app/controllers/sessions_controller.rb
class SessionsController < ApplicationController
  def create
    user = User.find_by(email: params[:email])
    if user&.authenticate(params[:password])
      session[:user_id] = user.id
      redirect_to root_path, notice: "ログインしました"
    else
      flash.now[:alert] = "メールアドレスまたはパスワードが正しくありません"
      render :new
    end
  end

  def destroy
    session[:user_id] = nil
    redirect_to root_path, notice: "ログアウトしました"
  end
end

session[:user_id] = user.idでユーザーIDをセッションに保存し、session[:user_id] = nilで削除しています。セッションのデータは次のリクエスト以降も保持されるため、ログイン状態を維持できます。

セッションの読み取りと削除

保存したセッションデータの読み取りや削除は以下のように行います。

app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
  helper_method :current_user, :logged_in?

  private

  def current_user
    # セッションからユーザーIDを読み取り、ユーザーを検索
    @current_user ||= User.find_by(id: session[:user_id])
  end

  def logged_in?
    current_user.present?
  end

  def require_login
    unless logged_in?
      redirect_to login_path, alert: "ログインが必要です"
    end
  end
end

session[:user_id]でセッションに保存されたユーザーIDを取得しています。セッションを完全にクリアするにはreset_sessionメソッドを使います。

Ruby
# 特定のキーを削除
session.delete(:user_id)

# セッション全体をリセット
reset_session

セッションストアの種類

Railsではセッションデータの保存先を設定できます。主なストアの種類は以下のとおりです。

ストア 説明 特徴
:cookie_store クッキーに暗号化して保存(デフォルト) 設定不要、サイズ4KB制限
:active_record_store データベースに保存 サイズ制限なし、サーバー側で管理
:cache_store キャッシュストア(Redis等)に保存 高速、スケーラブル

セッションストアの設定

デフォルトのcookie_storeから変更するには、設定ファイルを編集します。

config/initializers/session_store.rb
# cookie_store(デフォルト)
Rails.application.config.session_store :cookie_store, key: "_myapp_session"

# active_record_store(要gem追加)
Rails.application.config.session_store :active_record_store

active_record_storeを使う場合は、Gemfileにgem 'activerecord-session_store'を追加し、マイグレーションを実行します。

ターミナル
rails generate active_record:session_migration
rails db:migrate

実践的な使用例:ショッピングカート

セッションを使ったショッピングカートの簡易実装例です。

app/controllers/cart_controller.rb
class CartController < ApplicationController
  def add
    session[:cart] ||= []
    session[:cart] << params[:product_id]
    redirect_to products_path, notice: "カートに追加しました"
  end

  def show
    @cart_items = Product.where(id: session[:cart] || [])
  end

  def clear
    session.delete(:cart)
    redirect_to cart_path, notice: "カートを空にしました"
  end
end
ポイント

セッションにはユーザーIDなど最小限の識別情報のみを保存し、大量のデータは保存しないようにしましょう。大きなデータはデータベースに保存し、セッションにはそのキー(IDなど)だけを持たせるのがベストプラクティスです。

注意

デフォルトの:cookie_storeではセッションデータがクライアント側のクッキーに暗号化して保存されます。機密情報をセッションに保存する場合は、:active_record_store:cache_storeを検討してください。

まとめ

  • session[:key] = valueでセッションにデータを保存する
  • session[:key]でデータを読み取り、session.delete(:key)で削除する
  • reset_sessionでセッション全体をリセットする
  • デフォルトはcookie_store(4KB制限)、大量データにはactive_record_storeを使う
  • セッションには最小限の識別情報のみを保存する
  • ログイン管理やカート機能にセッションを活用できる