4

ある条件でパラメーターを変更する古いコードがありました。以前は機能していたと思います(100%ではありません)。条件が満たされているかどうかにかかわらず、params を nil に設定しています。

犯人は条件内params = tmp.dupです。条件が false の場合でも、更新アクションでエラーが発生しています。

最小限のテストで再現できました

(レール 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をブラウズする 新しいバグを作成する バグを送信する

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 に答える