複数の 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
ミックスインからメソッドを使用するのではなく、メソッド全体をコントローラーにコピーして貼り付けると、すべてが希望どおりに機能するため、メソッドが正しく機能することはかなり確信しています。
ミックスインからセッションにアクセスする方法はありますか?