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
免责声明:以下代码打破了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]处理请求期间,当前控制器实例将可用于全局
小智 5
如果您需要从模型访问控制器变量,通常意味着您的设计是错误的,因为控制器充当视图和模型之间的桥梁(至少在Rails中),控制器从模型获取信息,模型不应该知道控制器的任何信息,但是如果你想要这样做,你可以像jeem所说的那样做,但我宁愿这样做:
class << self
attr_accessor :current
end
Run Code Online (Sandbox Code Playgroud)
代替
cattr_accessor :current
你可以看到为什么这里=> cattr_accessor不能正常工作
| 归档时间: |
|
| 查看次数: |
34654 次 |
| 最近记录: |