在rails中分配/替换params散列

时间:2009-08-26 16:06:05

标签: ruby-on-rails ruby

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

if false
    params = {:user => {:name => "user", :comment => 'comment'}}
end

谢谢。

1 个答案:

答案 0 :(得分: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

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

irb(main):007:0> baz = "Example" if false
=> nil
irb(main):008:0> baz
=> nil

请参阅:Assignment - Local Variables and Methods in the Ruby docs