【问题标题】:Params becomming nil参数变为 nil
【发布时间】:2010-09-16 03:28:47
【问题描述】:

有一些旧代码在某些情况下会修改参数。我相信它以前有效(不是 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;

编辑应用程序/控制器/bugs_controller.rb 添加到更新操作的开头

l_p = params.dup

if (false)

  params = l_p.dup  # NOT REACHED

end

脚本/服务器 WEBrick -p 5001

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

【问题讨论】:

  • 你的问题似乎让我很困惑。您能否用一些通用代码详细说明该场景,以便我们更准确地理解它。
  • 是的,很混乱……请详细说明。

标签: ruby-on-rails controller params


【解决方案1】:

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

assign/replace params hash in 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多