Рельсы params.nil? если еще - PullRequest
0 голосов
/ 04 мая 2018

У меня есть этот простой код рельсов, и происходит что-то странное. Как видите, params.nil? - это true, и он все еще вызывает остальную часть. Что мне здесь не хватает?

Pry Session

     5: def build_resource
     6:   binding.pry
     7:   if params.nil?
     8:     model_class.new
     9:   else
 => 10:     params = params.merge(dealer: {})
    11:     model_class.new(dealer_params)
    12:   end
    13: end

[3] pry(#<Admin::DealersController>):1> params.nil?
true

Ответы [ 2 ]

0 голосов
/ 04 мая 2018

Итак, ответьте на мой вопрос (https://stackoverflow.com/a/1335890):

Params, который содержит параметры запроса, на самом деле является вызовом метода, который возвращает хеш, содержащий параметры. Ваша строка params = присваивается локальной переменной params.

После блока if false Ruby увидел локальную переменную params, поэтому при последующем обращении к params в методе локальная переменная имеет приоритет над вызовом метода с тем же именем. Однако, поскольку ваше params = assignment находится в блоке 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
0 голосов
/ 04 мая 2018

Нет, это не простая проблема. Вы просто не можете переназначить параметры на параметры. Попробуйте использовать другую переменную. Это должно работать нормально.

Вы можете использовать как

dealer_params = params.merge(dealer: {})

обновленный ответ

Копаем глубже внутри Rails. Посмотрите на это.

class Parameters

cattr_accessor :permit_all_parameters, instance_accessor: false, default: false

cattr_accessor :action_on_unpermitted_parameters, instance_accessor: false

.....
end

Простое объяснение: params отвечают за балансовую стоимость, которую вы разрешаете внутри вашего контроллера, но его отказ от него возвращает false или nil. Вы можете изучить эти темы в отделе, который вы узнаете.

https://apidock.com/rails/Class/cattr_accessor

Поэтому, когда вы объявляете новую переменную, ей присваивается значение params => (object). Но когда вы делаете то же самое с параметрами или методом, которые возвращают объект, это даст ноль.

ЖЕ Ответ: вы просто не можете переназначить параметры на параметры.

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