Ruby on Railsのセッションは、ユーザーごとのデータをリクエストをまたいで保持するための仕組みです。ログイン状態の管理やショッピングカートの保持など、Webアプリケーションでステートフルな操作を実現するために欠かせない機能です。この記事では、セッションの基本的な使い方から設定方法まで解説します。
基本的な使い方
セッションにデータを保存するには、sessionハッシュを使います。コントローラー内でキーと値のペアを設定するだけです。
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
endsession[:user_id] = user.idでユーザーIDをセッションに保存し、session[:user_id] = nilで削除しています。セッションのデータは次のリクエスト以降も保持されるため、ログイン状態を維持できます。
セッションの読み取りと削除
保存したセッションデータの読み取りや削除は以下のように行います。
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
endsession[:user_id]でセッションに保存されたユーザーIDを取得しています。セッションを完全にクリアするにはreset_sessionメソッドを使います。
# 特定のキーを削除
session.delete(:user_id)
# セッション全体をリセット
reset_sessionセッションストアの種類
Railsではセッションデータの保存先を設定できます。主なストアの種類は以下のとおりです。
| ストア | 説明 | 特徴 |
|---|---|---|
| :cookie_store | クッキーに暗号化して保存(デフォルト) | 設定不要、サイズ4KB制限 |
| :active_record_store | データベースに保存 | サイズ制限なし、サーバー側で管理 |
| :cache_store | キャッシュストア(Redis等)に保存 | 高速、スケーラブル |
セッションストアの設定
デフォルトのcookie_storeから変更するには、設定ファイルを編集します。
# cookie_store(デフォルト)
Rails.application.config.session_store :cookie_store, key: "_myapp_session"
# active_record_store(要gem追加)
Rails.application.config.session_store :active_record_storeactive_record_storeを使う場合は、Gemfileにgem 'activerecord-session_store'を追加し、マイグレーションを実行します。
rails generate active_record:session_migration
rails db:migrate実践的な使用例:ショッピングカート
セッションを使ったショッピングカートの簡易実装例です。
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を使う
- セッションには最小限の識別情報のみを保存する
- ログイン管理やカート機能にセッションを活用できる