2013-04-26 14 views
5

Ist es möglich, ein einzelnes Attribut eines Hashs mit starken Parametern zu kennzeichnen?Starke Parameter, die ein Attribut erfordern

Bei Eingabe wie:

{ 
    "example" => { 
    "optional": 1234, 
    "required": 5678 
    } 
} 

Die Standard starke params Beispiele sind:

params.require(:example).permit(:optional, :required)

Vorausgesetzt, dass Sie bestimmte Parameter erfordern können, dachte ich folgendes funktionieren würde:

params.require(:example).require(:required) 
params.require(:example).permit(:optional) 

Ich habe versucht:

params.require(:example => [ :required ]).permit(:optional) 
params.require(:example).permit(:optional) 
params[:example].require(:required) 

Und alles andere, woran ich denken kann.

Weiß jemand, ob es möglich ist?

Antwort

5

Greg!

Ich hatte die gleiche Frage, aber schließlich fand ich, dass es nicht die richtige Frage ist.

Schauen Sie, hier ist der Quellcode erfordern Methode in strong_parameters gem:

def require(key) 
    self[key].presence || raise(ActionController::ParameterMissing.new(key)) 
end 

Also, im Grunde gibt es keine Möglichkeit "erforderlich" -Attribut in params-Hash zu verlangen. Aber sieh es von anderer Seite an. Ich denke, es ist besser, schreiben Sie Ihre eigene Methode, um dies zu tun. Da ich Schienen verwende, habe ich gerade validates_presence_of zum Modell hinzugefügt. Wenn Sie es dynamisieren möchten, können Sie eine benutzerdefinierte Validierung erstellen. Sie können ihre Dokumentation finden Sie hier:

http://guides.rubyonrails.org/v3.2.13/active_record_validations_callbacks.html#performing-custom-validations

+0

Danke RunFor. Ich kam zu demselben Schluss. In meinem Fall hängt die Anwesenheitsanforderung von der Art ab, auf die die Ressource zugegriffen wird (dh über den Controller), aber ich konnte eine bedingte Validierung einsetzen, um dabei zu helfen. –

0

Was können Sie tun, zu verwenden ist

def example_params 
    params.require(:example) 
    params[:example].require(:required) 
    params.require(:example).permit(:required, :optional) 
end 

Die erste Zeile schlägt fehl, wenn :example fehlt. Die zweite Zeile schlägt fehl, wenn von :example fehlt. Die dritte Zeile gibt zurück, was Sie erwarten, während :optional zulässig ist.

Verwandte Themen