Рельсы params.nil? если еще
У меня есть этот простой код рельсов, и происходит что-то странное. Как вы видете params.nil?
является true
и это все еще вызывает остальную часть. Что мне здесь не хватает?
Прай сессия
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 ответа
Нет, это не простая проблема. Вы просто не можете переназначить параметры на параметры. Попробуйте использовать другую переменную. Это должно работать нормально.
Вы можете использовать как
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). Но когда вы делаете то же самое с параметрами или методом, которые возвращают объект, это даст ноль.
ЖЕ Ответ: вы просто не можете переназначить параметры на параметры.
Итак, это ответ на мой вопрос ( /questions/17792619/naznachit-zamenit-hesh-parametrov-v-relsah/17792624#17792624):
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