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编辑错误提交
根据用户45147评论,此问题的正确答案如下:
在这里复制:
在
params其中包含请求参数实际上是一个方法调用,它返回一个包含参数的散列.您的params =行正在分配一个名为的局部变量params.在
if false块之后,Ruby已经看到了局部params变量,因此当您params稍后在方法中引用时,局部变量优先于调用同名方法.但是,因为您的params =赋值在一个if false块内,所以局部变量永远不会赋值,因此局部变量是nil.如果在分配之前尝试引用局部变量,则会出现NameError:
Run Code Online (Sandbox Code Playgroud)irb(main):001:0> baz NameError: undefined local variable or method `baz' for main:Object from (irb):1但是,如果对变量的赋值不在代码执行路径中,则Ruby已创建局部变量,但其值为
nil.Run Code Online (Sandbox Code Playgroud)irb(main):007:0> baz = "Example" if false => nil irb(main):008:0> baz => nil
| 归档时间: |
|
| 查看次数: |
2375 次 |
| 最近记录: |