web-dev-qa-db-fra.com

Les paramètres forts nécessitent plusieurs

Je reçois un paquet JSON comme:

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

Je voudrais dire à Rails que point_code et guid sont obligatoires et pas seulement autorisés. 

Ce code semble fonctionner, mais je ne pense pas que ce soit une bonne pratique car il retourne une chaîne, pas l'objet complet:

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

Des idées comment je pourrais faire ceci?

28
Rob

J'ai eu un besoin similaire et ce que j'ai fait était

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

Exemple:

def create
  @point_code = PointCode.new(point_code_params)
end
24
sarunw

OK, c'est pas beau mais devrait faire l'affaire. Supposons que vous avez les paramètres: foo,: bar et: baf, vous aimeriez avoir tout pour une chose. Tu pourrais dire

def thing_params
  [:foo, :bar, :baf].each_with_object(params) do |key, obj|
    obj.require(key)
  end
end

each_with_object renvoie obj, qui est initialisé pour être param. En utilisant les mêmes paramètres obj, vous avez besoin de chacune de ces clés, puis vous retournez l’objet. Pas joli, mais travaille pour moi.

6
EdvardM

require prend un paramètre. Il est donc impossible de passer plusieurs clés à moins de remplacer la méthode require. Vous pouvez réaliser ce que vous voulez avec une logique supplémentaire dans votre action:

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
0
usha

Cette question est apparue dans ma recherche google pour un cas différent, par exemple, lors de l'utilisation d'un "multiple: true" comme dans:

<%= form.file_field :asset, multiple: true %>

Ce qui est un cas totalement différent de la question. Cependant, dans l’intérêt d’aider ici, voici un exemple pratique dans Rails 5+:

form_params = params.require(:my_profile).permit({:my_photos => []})
0
Nate Flink