Ruby on Rails – 从模型访问控制器变量

我试图访问在模型中的控制器中设置的实例变量。 控制器是产品控制器,型号是产品型号。 实例变量是另一个名为account的模型的实例。

实例变量是@current_account

当我运行代码没有任何反应时,我没有收到错误。 有谁知道在哪里可以找到关于模型中控制器中设置的访问实例变量的内容?

谢谢

EEF

您通常不应该尝试从模型中访问控制器以获取我不会涉及的高级问题。

我解决了类似的问题:

 class Account < ActiveRecord::Base cattr_accessor :current end class ApplicationController < ActionController::Base before_filter :set_current_account def set_current_account # set @current_account from session data here Account.current = @current_account end end 

然后只需使用Account.current访问当前Account.current

免责声明:以下代码打破了MVC惯例,即…

使用类属性可能会导致线程安全问题。 我将使用Thread.current + around_filter在线程级别存储控制器相关数据,并确保在请求完成之前清除它:

 class ApplicationController < ActionController::Base around_filter :wrap_with_hack def wrap_with_hack # We could do this (greener solution): # http://coderrr.wordpress.com/2008/04/10/lets-stop-polluting-the-threadcurrent-hash/ # ... but for simplicity sake: Thread.current[:controller] = self begin yield ensure # Prevent cross request access if thread is reused later Thread.current[:controller] = nil end end end 

现在,在通过Thread.current [:controller]处理请求期间,当前控制器实例将可用于全局

如果你需要从模型中访问控制器变量,它通常意味着你的设计是错误的,因为控制器充当视图和模型之间的桥梁(至少在Rails中),控制器从模型获取信息,模型不应该知道控制器的任何信息,但是如果你想要这样做,你可以像jeem所说的那样做,但我宁愿这样做:

  class << self attr_accessor :current end 

代替

  cattr_accessor:当前 

你可以看到为什么这里=> cattr_accessor不能正常工作

我不能直接评论所以我会在这里发帖:接受的答案似乎不对。 正如@vise所说,类变量在请求之间共享。 因此,除非整个应用程序只有一个当前帐户,否则这将不会按预期运行。

有关更多信息,请参阅@molf接受的答案: Rails是否共享或者可以将请求分开访问相同的运行时变量?

我不确定我是否完全理解这个问题,但我会采取刺激措施。

我认为如果您需要从模型中访问控制器实例变量,那么您需要将其作为模型中的属性,或者将逻辑移动到其他类控制器,而不是模型。