我遇到了某种范围问题,它阻止了实例变量被从视图中调用的助手正确初始化。Ruby on Rails:使用视图助手初始化实例变量
#sample_controller.rb
class SampleController < ApplicationController
def test
end
end
#application_controller.rb
helper_method :display
def display
if not defined? @display
return @display = "a"
else
return @display += "a"
end
end
#test.html.erb
<%= display %>
<%= display %>
<%= @display %>
<%= @display.reverse %>
当显示样本/测试时,它会在“评估nil.reverse”时死亡并显示错误。这是令人惊讶的,因为前两个显示的调用应该已经初始化@display,我会想到的。如果<%= @ display.reverse%>被移除,则输出为“a aa”,表示@display实例变量已由辅助方法设置,但在视图中无法访问它。
如果控制器修改,从而成为(与原始视图代码):
class SampleController < ApplicationController
def test
display
end
end
输出成为“AA AAA一个一个”。如果我让它在控制器中显示2个电话,我会得到“aaa aaaa aa aa”。因此,似乎只有在控制器中进行的调用才会修改SampleController实例变量,而视图中的调用将修改视图无法访问的ApplicationController的实例变量。
这是一个在Rails中的错误还是我误解,这是由于某种原因的预期功能?
我碰到这个bug的上下文是试图创建一个logged_in? ApplicationController方法,它在第一次调用时设置@user变量,如果用户登录,则返回true或false。除非在视图中使用它之前在控制器中添加了不必要的调用,否则这将不起作用。
因此,在我的真实应用程序中,@display实际上是@user,它用于显示有关用户的信息。举个例子,我的意思是,典型的代码就像<%if logged_in?%><%= @ user.name%><%end%>。那么最好的方法是在ApplicationController中设置@user变量来执行before_filter调用?因为经常,对于给定的视图,@user的唯一用途就像我上面概述的那样,并且没有其他需要在控制器中使用它。 – 2010-01-24 21:48:30
是的,伊娃拷贝机制符合您所描述的内容。在过滤器之前设置@user。 – ffoeg 2010-01-24 21:57:30
谢谢@ffoeg,这个回答非常有帮助。你可以指向任何文档或导轨指南,这是解释? View,Controller和Helpers之间共享什么变量尚不清楚。 – CodeKid 2016-09-17 21:15:48