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

时间:2010-03-10 17:35:50

标签: ruby-on-rails ruby model instance

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

实例变量为@current_account

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

由于

EEF

5 个答案:

答案 0 :(得分:46)

一般情况下,您不应该尝试从模型中访问控制器,以解决我不会涉及的高级问题。

我解决了类似的问题:

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

访问当前帐户

答案 1 :(得分:8)

免责声明:以下代码违反了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]

可以全局使用

答案 2 :(得分:5)

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

 class << self

    attr_accessor :current

 end

而不是

cattr_accessor :current

你可以看到为什么这里=&gt; cattr_accessor doesn't work as it should

答案 3 :(得分:2)

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

有关详情,请参阅@molf接受的答案:Is Rails shared-nothing or can separate requests access the same runtime variables?

答案 4 :(得分:1)

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

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