2009-08-26 53 views
5

我在轨道控制器操作下面的代码序列。按照预期,在IF之前,PARAMS包含请求参数。之后,参数是零。任何人都可以请解释这里发生了什么?在rails中分配/替换参数哈希

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

谢谢。

回答

10

包含请求参数的params实际上是一个方法调用,它返回一个包含参数的散列。您的params =行将分配给一个名为params的本地变量。

if false块之后,红宝石已经看到了当地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 

但是如果有一个分配给这不是在代码执行路径,然后红宝石变量已创建局部变量,但其值为nil

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

“Ruby已经看到了本地参数”真的,Ruby?真!!!??? O_o(对不起,但是这花了我几天的时间......看到没有执行,是吗?) – steffen 2017-04-12 11:25:25