Подтвердить что ты не робот

Сильные параметры требуют нескольких

Я получаю пакет JSON, например:

{
  "point_code" : { "guid" : "f6a0805a-3404-403c-8af3-bfddf9d334f2" }
}

Я хотел бы сказать Rails, что требуются как point_code, так и guid, а не только разрешенные.

Этот код работает, но я не думаю, что это хорошая практика, поскольку он возвращает строку, а не полный объект:

params.require(:point_code).require(:guid)

Любые идеи, как я мог это сделать?

4b9b3361

Ответ 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

Ответ 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