Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 从mixin设置控制器会话值_Ruby On Rails_Ruby_Ruby On Rails 3_Session_Mixins - Fatal编程技术网

Ruby on rails 从mixin设置控制器会话值

Ruby on rails 从mixin设置控制器会话值,ruby-on-rails,ruby,ruby-on-rails-3,session,mixins,Ruby On Rails,Ruby,Ruby On Rails 3,Session,Mixins,我有一个方法需要跨多个Rails控制器使用。为了使代码保持干爽,我将此方法拆分为一个扩展模块,然后将其包含到任何控制器中 需要这样使用它: # app/controllers/jobs_controller.rb require "extensions/job_sorting_controller_extensions" class JobsController < ApplicationController include Extensions::JobSortingControl

我有一个方法需要跨多个Rails控制器使用。为了使代码保持干爽,我将此方法拆分为一个扩展模块,然后将其包含到任何控制器中 需要这样使用它:

# 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
#app/controllers/jobs_controller.rb
需要“扩展/作业\排序\控制器\扩展”
类JobsController
如您所见,
job\u sort\u order
需要访问会话。问题是我似乎无法从mixin访问会话。我没有收到任何错误或任何东西,只是从未设置会话

我相当确信
作业排序顺序
方法工作正常,因为如果我将整个方法复制/粘贴回控制器,而不是从mixin中使用它,那么一切都会按照我所希望的方式工作


有没有办法从mixin访问会话?

有几种方法可以掌握正在发生的事情。使用愚蠢的puts检查会话对象。使用调试器或pry单步执行

从我在代码中看到的情况来看,我认为您的模块实际上可以访问会话。否则它将抛出一个名称错误,因为会话将是未知的,因为它没有在您的模块中定义


如果会话对象的值在请求之间不存在,那么我猜您的会话处理有问题。在您的会话中还有其他内容吗?

您是否从您的作业管理员处调用作业排序命令?是的。抱歉,这应该更明确。不确定这是否是mixin的问题,如果mixin中不存在
会话
,它不会抛出“未定义的局部变量或方法”消息吗?@robbrit不,如果包含模块,它将获得对include类的变量/方法的访问权。这就是我的想法。因此mixin确实可以访问会话,问题可能在其他地方。