назначить / заменить хэш параметров в рельсах - PullRequest
5 голосов
/ 26 августа 2009

У меня есть последовательность кода ниже в действии контроллера рельсов. Перед IF, params содержит параметры запроса, как и ожидалось. После этого params равен нулю. Может кто-нибудь объяснить, что здесь происходит?

if false
    params = {:user => {:name => "user", :comment => 'comment'}}
end

Спасибо.

1 Ответ

11 голосов
/ 26 августа 2009

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

См .: Назначение - локальные переменные и методы в документах Ruby .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...