Сильные параметры требуют нескольких
Я получаю пакет JSON, например:
{
"point_code" : { "guid" : "f6a0805a-3404-403c-8af3-bfddf9d334f2" }
}
Я хотел бы сказать Rails, что требуются как point_code
, так и guid
, а не только разрешенные.
Этот код работает, но я не думаю, что это хорошая практика, поскольку он возвращает строку, а не полный объект:
params.require(:point_code).require(:guid)
Любые идеи, как я мог это сделать?
Ответы
Ответ 1
У меня была аналогичная потребность, и я сделал это
def point_code_params
params.require(:point_code).require(:guid) # for check require params
params.require(:point_code).permit(:guid) # for using where hash needed
end
Пример:
def create
@point_code = PointCode.new(point_code_params)
end
Ответ 2
Начиная с 2015 года (RoR 5. 0+), вы можете передать массив ключей для метода require
в rails:
params.require([:point_code, :guid])
http://api.rubyonrails.org/classes/ActionController/Parameters.html#method-i-require
Ответ 3
ОК, не очень, но должен сделать трюк. Предположим, у вас есть параметры: foo,: bar и: baf, которые вы хотели бы потребовать для всего Thing. Вы могли бы сказать
def thing_params
[:foo, :bar, :baf].each_with_object(params) do |key, obj|
obj.require(key)
end
end
each_with_object
возвращает obj, который инициализируется как params. Используя те же параметры obj, вам нужно поочередно использовать каждый из этих ключей и, наконец, вернуть объект. Не очень, но работает для меня.
Ответ 4
require
принимает один параметр. Таким образом, вы не можете передавать несколько ключей, если не переопределить метод require
. Вы можете достичь того, чего хотите, с некоторой дополнительной логикой в своем действии:
def action
raise ActionController::ParameterMissing.new("param not found: point_code") if point_params[:point_code].blank?
raise ActionController::ParameterMissing.new("param not found: guid") if point_params[:point_code][:guid].blank?
<do your stuff>
end
def point_params
params.permit(point_code: :guid)
end
Ответ 5
Этот вопрос возник в моем поиске Google для другого случая, т.е. При использовании "множественного числа: истина", как в:
<%= form.file_field :asset, multiple: true %>
Это совершенно другой случай, чем вопрос. Тем не менее, в целях помощи здесь приведен рабочий пример в Rails 5+ этого:
form_params = params.require(:my_profile).permit({:my_photos => []})
Ответ 6
Решение, предлагаемое в документации Rails:
def point_code
params.require(:point_code).permit(:guid).tap do |point_code_params|
point_code_params.require(:guid) # SAFER
end
end