我在ApplicationController文件中创建了一个方法,该方法应该在我的所有操作中设置实例变量:
def self.set_body_id(id)
print "This is test"
self.instance_variable_set(:@body_id, id)
end
当我在另一个控制器中调用此方法时,如下所示:
class HostingController < ApplicationController
set_body_id "Test"
def index
end
end
..没有任何反应。 @body_id
变量在视图中不可用。所以我运行一个rails控制台来检查这个函数是否被执行,正如我预期的那样,当我调用This is test
时,我输出HostingController.new
字符串,但仍然是@body_id
未定义。
此外,我从self
删除self.variable_instance_set
,甚至用@body_id = "Test"
补充此行,但这仍然无效。我做错了什么?
编辑:
我知道我犯了什么错误。我甚至在创建类实例之前尝试设置实例变量。 self.set_body_id
似乎涉及到一个班级initialize
,但仍然不知道该怎么做。
答案 0 :(得分:0)
我认为你必须这样写:
def set_body_id(id)
instance_variable_set("@body_id", id)
end
更新:我刚看到你使用了一个应该是实例方法的类方法。我更新了代码。
答案 1 :(得分:0)
class ApplicationController < ActionController::Base
protect_from_forgery
def self.set_body_id(id)
self.class_variable_set(:@@body_id, id)
end
before_filter :set_body_attributes
private
def set_body_attributes
@body_id = self.class.class_variable_get(:@@body_id)
end
end
感谢您的回复,感谢@apneadiving提示,我能够弄明白:)
答案 2 :(得分:0)
这应该可以帮到你
class ApplicationController < ActionController::Base
protected
def set_body(id)
ApplicationController.get_id(id)
end
def self.get_id(id)
self.class_variable_set(:@@body, id)
end
end
您的主机控制器
class HostingController < ApplicationController
before_filter :set_body
protected
def set_body
@body = super(params[:id])
end
end
我在set_body中设置的 @body 实例变量应该可以在所有方法中访问。通过检查来试试