[英]Why are undeclared @variables nil in html.erb and not a NameError
如果渲染的html.erb文件没有在控制器中分配变量(例如@user = params["user_name"] )
那么为什么它将@user
视为nil
而不是抛出NameError: undefined local variable
。
例如:
<%= render partial: "greeting", locals: { user: @user } if @user %>
如果控制器将其传递给@user
,这将呈现问候语,但如果页面是第一次呈现并且用户尚未输入其用户名,则问候语将不会出现,而不是导致错误。 在我看来, @user
永远不会在html.erb执行的本地范围内声明,因此它应该导致错误。
这里发生了什么事? 也许@
以某种方式预处理意味着将变量视为符号并将其用作params
哈希中的键并返回结果?
未初始化的实例变量( @...
)计算为nil
。 您仍然可以使用defined?
检查是否已分配实例变量(包括赋值为nil
) defined?
方法:
[1] pry(main)> defined? @test
=> nil
[2] pry(main)> @test = nil
=> nil
[3] pry(main)> defined? @test
=> "instance-variable"
那么为什么它将
@user
视为nil
而不是抛出NameError: undefined local variable
。
好吧,它不是局部变量,它是一个实例变量。
但即使局部变量的行为方式也是一样的:
if false
local_var = 42 # needed so Ruby knows `local_var` isn't a method call
end
local_var
# => nil
@instance_variable
# => nil
$global_variable
# => nil
但奇怪的是:
Constant
# NameError: uninitialized constant Constant
@@class_variable
# NameError: uninitialized class variable @@class_variable in Object
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.