Params becomming nil

Bri*_*ian 4 controller ruby-on-rails params

有一些旧代码在某种情况下会修改params.我相信它之前有效(不是100%).我们现在将params设置为nil,无论条件是否满足.

罪魁祸首是在条件之内,我执行了params = tmp.dup.即使条件为假,也会导致更新操作出错.

我能够通过最小的测试重新创建

(Rails 2.3.5)

rails bug;
cd bug;

script/generate scaffold bug name:string;
rake db:create;
rake db:migrate;
Run Code Online (Sandbox Code Playgroud)

编辑apps/controllers/bugs_controller.rb添加到更新操作的开头

l_p = params.dup

if (false)

  params = l_p.dup  # NOT REACHED

end
Run Code Online (Sandbox Code Playgroud)

脚本/服务器WEBrick -p 5001

浏览到http:// localhost:5001/bugs 创建一个新的bug编辑错误提交

fot*_*nus 5

根据用户45147评论,此问题的正确答案如下:

在rails中分配/替换params散列

在这里复制:

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)