ruby-on-rails - 为什么在 html.erb 中未声明的@variables nil 而不是 NameError

标签 ruby-on-rails ruby erb

如果 html.erb 文件呈现时没有 Controller 中分配的变量(例如 @user = params["user_name"] )那么为什么它将 @user 视为 nil 而不是抛出 NameError: undefined local variable

例如:

<%= render partial: "greeting", locals: { user: @user } if @user %>

如果 Controller 将 @user 传递给它,这将呈现问候语,但如果页面是第一次呈现并且用户尚未输入他们的用户名,那么问候语将不会在那里,而不是导致错误。在我看来,@user 永远不会在 html.erb 正在执行的本地范围内声明,因此它应该会导致错误。

这里发生了什么?也许 @ 以某种方式进行了预处理,意味着将变量视为符号并将其用作 params 哈希中的键并返回结果?

最佳答案

未初始化的实例变量 (@...) 的计算结果为 nil。您仍然可以使用 defined? 方法检查实例变量是否已分配(包括分配给 nil):

[1] pry(main)> defined? @test
=> nil
[2] pry(main)> @test = nil
=> nil
[3] pry(main)> defined? @test
=> "instance-variable"

关于ruby-on-rails - 为什么在 html.erb 中未声明的@variables nil 而不是 NameError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25196482/

相关文章:

ruby-on-rails - 如何将一维ruby数组组合成二维数组?

ruby-on-rails - Facebook 图形 API gem

ruby - 使用 VCR 过滤掉 JWT 和 Bearer token

ruby - 如何正确使用Ruby套接字的接收超时?

ruby-on-rails - 在 1.x 和 2.x 之间对 Rails 的更改中,哪些确实影响了您在 Rails 中的工作?

ruby-on-rails - 使 Rails 表列属性只读

ruby - 来自 IO 的 RestClient 分段上传

ruby-on-rails - 将Markdown与Rails结合使用

ruby-on-rails - 添加 rails-erb-loader 会破坏 webpacker

ruby-on-rails - 如何更改Rails 3.0.10中使用的订单模板引擎?