我有一个方法需要跨多个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
需要访问会话。问题是我似乎无法从mixin访问会话。我没有收到错误或任何错误,会话永远不会被设置。
我非常确定job_sort_order
方法正常工作,因为如果我将整个方法复制/粘贴回控制器而不是从mixin中使用它,一切都按照我想要的方式工作。
有没有办法从mixin访问会话?
答案 0 :(得分:0)
有几种方法可以掌握正在发生的事情。使用stupid puts来检查你的会话对象。使用调试器或pry进入您的实现。
从我在你的代码中看到的,我认为你的模块实际上可以访问会话。否则会引发名称错误,因为会话将是未知的,因为它未在您的模块中定义。
如果会话对象的值在请求之间不存在,那么我认为会话处理有问题。你的会话中还有其他的东西吗?