Параметры, начинающиеся с нуля - PullRequest
4 голосов
/ 16 сентября 2010

Был какой-то старый код, который при некоторых условиях изменял бы параметры. Я считаю, что это работало раньше (не 100%). Теперь мы получаем параметры, равные нулю, независимо от того, выполняется условие или нет.

Виновник в состоянии, я выполняю 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 создать новую ошибку ошибка редактирования представить

1 Ответ

5 голосов
/ 24 февраля 2013

За комментарий пользователя 45147, правильный ответ на этот вопрос здесь:

назначить / заменить хэш параметров в рельсах

Копирование здесь:

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
...