gpt4 book ai didi

ruby-on-rails - Ruby on Rails : Initializing instance variables with helpers in view

转载 作者:行者123 更新时间:2023-12-05 00:42:22 25 4
gpt4 key购买 nike

我遇到了某种类型的范围问题,该问题阻止从 View 调用的帮助程序正确初始化实例变量。

#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 %> 被删除,则输出为“a aa”,表明 @display 实例变量正在由辅助方法设置,但在 View 中无法访问它。

如果将 Controller 修改为(使用原始 View 代码):
class SampleController < ApplicationController
def test
display
end
end

输出变为“aa aaa a a”。如果我在 Controller 中显示 2 次调用,我会得到“aaa aaaa aa aa”。因此,似乎只有在 Controller 中进行的调用才会修改 SampleController 实例变量,而 View 中的调用将修改 View 无法访问的 ApplicationController 的实例变量。

这是 Rails 中的错误还是我误解了,出于某种原因,这是预期的功能?

我遇到这个错误的上下文是试图创建一个logged_in? ApplicationController 方法在第一次被调用时设置一个@user 变量,如果用户登录则返回 true 或 false。除非我在尝试在 View 中使用它之前在 Controller 中添加了一个不必要的调用,否则这将不起作用。

最佳答案

渲染时有两个@display ivars,一个在 Controller 中,一个在 View 中。 View 无法访问 Controller 中的 View ,反之亦然。在渲染开始时,Rails 将所有 Controller 变量复制到 View 中。但是当时@display不存在,也没有复制过来。在任何 ruby​​ 程序中,对 @my_undefined_ivar 的调用都将返回 nil - 这正是发生在您身上的事情。

可能会令人困惑,这里有另一种说法。 Rails 在渲染开始时将 ivars 从 Controller 复制到 View 中。因此, View ivar 的变化不会反射(reflect)在 Controller ivar 中,反之亦然。您定义的帮助程序让 View 调用 Controller 上的方法,因此 Controller 的 ivar 可以作为返回值传递回 View ,但对 Controller ivar 本身的更改不会反射(reflect)在另一个 View 的 ivar 中。

在这种情况下只需使用辅助方法,而忘记 View 中的 @display。

关于ruby-on-rails - Ruby on Rails : Initializing instance variables with helpers in view,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2128406/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com