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

Dog*_*ler 3 ruby ruby-on-rails erb

如果html.erb文件被渲染,而不在控制器分配变量(例如@user = params["user_name"] )那么为什么它查看@user作为nil投掷代替NameError: undefined local variable.

例如:

<%= render partial: "greeting", locals: { user: @user } if @user %>
Run Code Online (Sandbox Code Playgroud)

这将在控制器传递问候时呈现问候语@user,但如果页面是第一次呈现并且用户尚未输入其用户名,则问候语将不会出现,而不是导致错误.在我看来,@user永远不会在html.erb执行的本地范围内声明,因此它应该导致错误.

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

Aug*_*ust 5

未初始化的实例变量(@...)评估为nil.您仍然可以nil使用以下defined?方法检查是否已分配实例变量(包括赋值):

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