在rails中分配/替换params散列

eug*_*gen 5 ruby ruby-on-rails

我在rails控制器动作中有下面的代码序列.在IF之前,params包含请求参数,如预期的那样.在它之后,params是零.有谁能解释这里发生了什么?

if false
    params = {:user => {:name => "user", :comment => 'comment'}}
end
Run Code Online (Sandbox Code Playgroud)

谢谢.

mik*_*kej 11

params其中包含请求参数实际上是一个方法调用,它返回一个包含参数的散列.您的params =行正在分配一个名为的局部变量params.

if false块之后,Ruby已经看到了局部params变量,因此当您params稍后在方法中引用时,局部变量优先于调用同名方法.但是,因为您的params =赋值在一个if false块内,所以局部变量永远不会赋值,因此局部变量是nil.

如果在分配之前尝试引用局部变量,则会出现NameError:

irb(main):001:0> baz
NameError: undefined local variable or method `baz' for main:Object
        from (irb):1
Run Code Online (Sandbox Code Playgroud)

但是,如果对变量的赋值不在代码执行路径中,则Ruby已创建局部变量,但其值为nil.

irb(main):007:0> baz = "Example" if false
=> nil
irb(main):008:0> baz
=> nil
Run Code Online (Sandbox Code Playgroud)

请参阅:分配 - Ruby文档中的局部变量和方法.