我遇到了某种类型的范围问题,它阻止了实例变量被从视图中调用的助手正确初始化。
#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 我会想到的。如果 <%= @display.reverse %> 被删除,则输出为“aa a”,表示 @display 实例变量正在由辅助方法设置,但在视图中无法访问它。
如果控制器被修改为(使用原始视图代码):
class SampleController < ApplicationController
def test
display
end
end
输出变为“aa aaa a a”。如果我让它在控制器中显示 2 次调用,我会得到“aaa aaaa aaa aa”。所以看起来只有控制器中的调用会修改 SampleController 实例变量,而视图中的调用会修改视图无权访问的 ApplicationController 的实例变量。
这是 Rails 中的错误还是我误解了,这是出于某种原因预期的功能?
我遇到这个错误的上下文是试图创建一个logged_in?ApplicationController 方法在第一次调用它时设置一个@user 变量,如果用户登录则返回true 或false。除非我在控制器中添加不必要的调用,然后再尝试在视图中使用它,否则这将不起作用。