0

複数の Rails コントローラーで使用する必要があるメソッドがあります。コードを DRY に保つために、このメソッドを拡張モジュールに分割しました。これを、次のように使用する必要があるコントローラーに含めることができます。

# app/controllers/jobs_controller.rb
require "extensions/job_sorting_controller_extensions"

class JobsController < ApplicationController
  include Extensions::JobSortingControllerExtensions

  def index
    @jobs = Job.order(job_sort_order)
  end
end

# lib/extensions/job_sorting_controller_extensions.rb
module Extensions
  module JobSortingControllerExtensions
    # Prevent sql injection and control the direction of the sort depending
    # on which option is selected. Remember the sort by storing in session.
    def job_sort_order
      if params[:job_sort].present?
        job_sort = case params[:job_sort]
                   # This makes jobs which have no due date at all go to the bottom
                   # of the list. INFO: http://stackoverflow.com/a/8949726/574190
                   # If due_date ever becomes required then this can be simplified.
                   when "due_date" then "coalesce(due_date, '3000-12-31') asc"
                   when "created_at" then "created_at desc"
                   end
        session[:job_sort] = job_sort
      end

      # Set the session :job_sort to a default if it's empty at this point.
      session[:job_sort] ||= "created_at desc"
    end
  end
end

ご覧のとおりjob_sort_order、セッションへのアクセスが必要です。問題は、ミックスインからセッションにアクセスできないように見えることです。エラーなどは発生しません。セッションが設定されません。

job_sort_orderミックスインからメソッドを使用するのではなく、メソッド全体をコントローラーにコピーして貼り付けると、すべてが希望どおりに機能するため、メソッドが正しく機能することはかなり確信しています。

ミックスインからセッションにアクセスする方法はありますか?

4

1 に答える 1

0

何が起こっているのか把握する方法はいくつかあります。セッションオブジェクトを検査するには、愚かなプットを使用してください。デバッガーを使用するか、pry を使用して実装にステップ インします。

あなたのコードで見たものから、あなたのモジュールは実際にセッションにアクセスできると思います。そうしないと、モジュールで定義されていないためセッションが不明になるため、名前エラーがスローされます。

セッションオブジェクトの値がリクエスト間で保持されない場合は、セッション処理に問題があると思います。セッションで他に保持されているものはありますか?

于 2012-07-06T14:55:58.047 に答える