概要
ウェブアプリケーションにおいて、ユーザーが現在閲覧している企業の情報をセッションやクッキーを通じて保存し、画面遷移してもその情報を保持する方法について解説します。この機能は、ユーザーがサイト内で異なるページを訪れる際にも、選択した企業を忘れずに操作を続けられるようにするためのものです。
実装ステップ
-
現在閲覧中の企業情報の設定
-
viewing_company
メソッドをコントローラに定義します。このメソッドは、セッションまたはクッキーから企業IDを取得し、対応する企業情報をデータベースから検索します。
-
-
セッションとクッキーの使用
- ユーザーが企業を選択した際に、その企業のIDをセッションやクッキーに保存します。これにより、ユーザーがサイト内を移動しても選択した企業情報を保持できます。
-
ビューでの表示
- コントローラで定義した
viewing_company
をビューで利用して、現在選択されている企業の情報を表示します。
- コントローラで定義した
コード例
class ApplicationController < ActionController::Base
helper_method :viewing_company
before_action :store_user_location!, if: :storable_location?
private
def viewing_company # 閲覧中の企業情報の定義
@viewing_company ||= find_viewing_company
session[:viewing_company_id] = @viewing_company.try(:id) if customer_signed_in? && @viewing_company
@viewing_company
end
def find_viewing_company
if customer_signed_in?
# ログイン中の場合はsessionもしくはparamsから情報取得(⇒*1)
find_company_from_session_or_params
else
# ログイン中でない場合はcookieを使用する(⇒*2)
find_company_from_params_or_cookies
end
end
def find_company_from_session_or_params # (*1)
Company.find_by(id: session[:viewing_company_id]) ||
current_company ||
Company.find_by(id: params[:company_id])
end
def find_company_from_params_or_cookies # (*2)
Company.find_by(id: params[:company_id]) ||
Company.find_by(id: cookies.encrypted[:viewing_company_id])
end
end
補足
コントローラとヘルパーのどちらでviewing_companyを定義するかについての考察です。
コントローラの使用基準
- ビジネスロジック:アプリケーションの主要なビジネスロジックやデータ処理はコントローラで行います。
- 状態管理:セッションやクッキーを使ったユーザーの状態管理もコントローラの責務です。
-
フィルタリング:特定のアクションの前後で共通の処理を行いたい場合(例:
before_action
)、コントローラで実装します。
ヘルパーの使用基準
- ビューの補助:ビューに表示するデータを整形するロジックはヘルパーに記述します。
- 再利用可能なビューコード:複数のビューで共通して使用する小さなフラグメントやフォーマット変更のロジックは、ヘルパーとして定義すると便利です。