【问题标题】:Set controller session value from a mixin从 mixin 设置控制器会话值
【发布时间】:2012-07-06 13:16:40
【问题描述】:

我有一个需要跨多个 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

如您所见,job_sort_order 需要访问会话。问题是我似乎无法从 mixin 访问会话。我没有收到错误或任何东西,会话永远不会设置。

我相当确定 job_sort_order 方法可以正常工作,因为如果我将整个方法复制/粘贴回控制器而不是从 mixin 中使用它,一切都会按我的意愿工作。

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

【问题讨论】:

  • 您是从 JobsController 调用 job_sort_order 吗?
  • 是的,我是。对不起,那应该更明确。
  • 不确定是否是 mixin 的问题,如果 session 在 mixin 中不存在,它不会抛出“未定义的局部变量或方法”消息吗?
  • @robbrit 不,如果你包含一个模块,它可以访问包含类的变量/方法。
  • 我就是这么想的。所以 mixin 确实可以访问会话,问题可能出在其他地方。

标签: ruby-on-rails ruby ruby-on-rails-3 session mixins


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多