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

Rai*_*Son 19 ruby model ruby-on-rails instance

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

实例变量是 @current_account

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

谢谢

EEF

jee*_*eem 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
Run Code Online (Sandbox Code Playgroud)

然后只需访问当前帐户 Account.current

  • 所有请求都不共享类变量吗?! (12认同)

iba*_*xas 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
Run Code Online (Sandbox Code Playgroud)

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

  • 类变量在线程之间共享。这意味着当使用像 puma 这样的多线程应用服务器时,处理不同请求的不同线程会将控制器实例存储在同一个变量中,相互覆盖。通过使用 Thread.current 哈希,您可以确保该变量仅由当前线程设置。抱歉(2 年)延迟... (2认同)

小智 5

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

 class << self

    attr_accessor :current

 end
Run Code Online (Sandbox Code Playgroud)

代替

cattr_accessor :current

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