Params becomming nil

时间:2010-09-16 03:28:47

标签: ruby-on-rails controller 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;

编辑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 提交

1 个答案:

答案 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