有些旧代码在某些情况下会修改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;
编辑apps / controllers / bugs_controller.rb 添加到更新操作的开头
l_p = params.dup
if (false)
params = l_p.dup # NOT REACHED
end
脚本/服务器WEBrick -p 5001
浏览http://localhost:5001/bugs 创建一个新的bug 编辑bug 提交
答案 0 :(得分:5)
根据用户45147评论,此问题的正确答案如下:
assign/replace params hash in rails
在这里复制:
包含请求参数的
params
实际上是a 方法调用,返回包含参数的哈希。您的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