4

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

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

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

(轨道 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 提交

4

1 回答 1

6

根据 user45147 的评论,这个问题的正确答案在这里:

在rails中分配/替换参数哈希

复制到这里:

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
于 2013-02-24T15:00:37.250 回答