0
0

閲覧情報の保存機能の実装(cookie使用)

Posted at

概要

ウェブアプリケーションにおいて、ユーザーが現在閲覧している企業の情報をセッションやクッキーを通じて保存し、画面遷移してもその情報を保持する方法について解説します。この機能は、ユーザーがサイト内で異なるページを訪れる際にも、選択した企業を忘れずに操作を続けられるようにするためのものです。

実装ステップ

  1. 現在閲覧中の企業情報の設定

    • viewing_companyメソッドをコントローラに定義します。このメソッドは、セッションまたはクッキーから企業IDを取得し、対応する企業情報をデータベースから検索します。
  2. セッションとクッキーの使用

    • ユーザーが企業を選択した際に、その企業のIDをセッションやクッキーに保存します。これにより、ユーザーがサイト内を移動しても選択した企業情報を保持できます。
  3. ビューでの表示

    • コントローラで定義した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)、コントローラで実装します。

ヘルパーの使用基準

  • ビューの補助:ビューに表示するデータを整形するロジックはヘルパーに記述します。
  • 再利用可能なビューコード:複数のビューで共通して使用する小さなフラグメントやフォーマット変更のロジックは、ヘルパーとして定義すると便利です。
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0