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?
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
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.
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
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 => []})