【发布时间】:2011-01-08 20:41:18
【问题描述】:
我遇到了某种类型的范围问题,它阻止了从视图调用的帮助程序正确初始化实例变量。
#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 我会想到的。如果 被移除,则输出为“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。除非我在控制器中添加不必要的调用,然后再尝试在视图中使用它,否则这将不起作用。
【问题讨论】:
标签: ruby-on-rails view variables instance helper