Ich erhalte ein JSON-Paket wie:
{
"point_code" : { "guid" : "f6a0805a-3404-403c-8af3-bfddf9d334f2" }
}
Ich möchte Rails mitteilen, dass sowohl point_code
als auch guid
erforderlich sind und nicht nur erlaubt sind.
Dieser Code scheint zu funktionieren, aber ich denke nicht, dass es eine gute Praxis ist, da er eine Zeichenfolge und nicht das vollständige Objekt zurückgibt:
params.require(:point_code).require(:guid)
Irgendwelche Ideen, wie ich das machen könnte?
Ich hatte ein ähnliches Bedürfnis und was ich tat, war
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
Beispiel:
def create
@point_code = PointCode.new(point_code_params)
end
Ab 2015 (RoR 5.0+) können Sie eine Reihe von Schlüsseln an die require
-Methode in Rails übergeben:
params.require([:point_code, :guid])
http://api.rubyonrails.org/classes/ActionController/Parameters.html#method-i-require
OK, ist nicht hübsch, aber sollte den Trick tun. Angenommen, Sie haben params: foo,: bar und: baf, die Sie alles für ein Ding benötigen würden. Du könntest sagen
def thing_params
[:foo, :bar, :baf].each_with_object(params) do |key, obj|
obj.require(key)
end
end
each_with_object
gibt obj zurück, das als Parameter initialisiert wird. Wenn Sie die gleichen Parameter verwenden, benötigen Sie nacheinander alle diese Schlüssel und geben das Objekt zurück. Nicht hübsch, aber funktioniert für mich.
Die in der Rails Dokumentation vorgeschlagene Lösung lautet:
def point_code
params.require(:point_code).permit(:guid).tap do |point_code_params|
point_code_params.require(:guid) # SAFER
end
end
require
nimmt einen Parameter. Es gibt also keine Möglichkeit, mehrere Schlüssel zu übergeben, es sei denn, Sie überschreiben die require
-Methode. Sie können erreichen, was Sie mit einer zusätzlichen Logik in Ihrer Aktion wollen:
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
Diese Frage wurde in meiner Google-Suche nach einem anderen Fall angezeigt, z. B. bei Verwendung eines "multiple: true" wie in:
<%= form.file_field :asset, multiple: true %>
Welches ist ein ganz anderer Fall als die Frage. Im Interesse der Unterstützung ist hier jedoch ein Arbeitsbeispiel in Rails 5+ davon:
form_params = params.require(:my_profile).permit({:my_photos => []})