2013-07-16 4 views
15

Ich habe dies in meinem Controller:Wie kann man einen optionalen starken Parameter-Schlüssel machen, aber trotzdem darin enthaltene Parameter filtern?

params.require(:item).permit! 

Lassen Sie uns diese rspec spec annehmen:

put :update, id: @item.id, item: { name: "new name" } 

Es funktioniert wie erwartet, kein Fehler. wenn ich dies jedoch verwenden:

put :update, id: @item.id, item: nil 

ich ActionController::ParameterMissing, die ich will nicht zu bekommen. Es hat mit Controller-Makros zu tun, die ich für andere Aktionen benutze und über die ich die gesendeten Parameter nicht kontrollieren kann (die Makros suchen nach Benutzer-Credentials, so dass es mir eigentlich egal ist, eine #update Aktion zu testen, ich teste nur before_filters dafür).

Also meine Frage ist: Wie mache ich params[:item] optional, noch Filter Attribute in ihm, wenn es vorhanden ist?

+4

Einige gute Ideen bei https://github.com/rails/rails/issues/9534. Grundsätzlich ist der Vorschlag, '# fetch' anstelle von' # require' zu ​​verwenden, da es einen zweiten Parameter für einen Standard hat, z. B .: 'params.fetch (: item, {}). Permit!'. – mtjhax

+0

@ Mtjhax super, thx! das wäre es wert, eine Antwort zu geben. – srecnig

Antwort

25

Was:

params.require(:item).permit! if params[:item]

Sie keine optionalen Parameter erfordern kann. Das ist widersprüchlich.

Edit: als mtjhax in seinem Kommentar erwähnt, gibt es Ratschläge von herefetch stattdessen zu verwenden: params.fetch(:item, {}).permit!

+1

Ich denke du hast seine Frage missverstanden. Es ist durchaus zulässig, den Hauptcontainer (: item) zu verlangen, während einige seiner internen Unterattribute nur optional sind, was neben der Verwendung von 'params.require (: item) .permit!' (Das erlaubt alle Parameter solange wie sie sind innerhalb von ': item' und': item' exists scheint nicht in einer granularen Art. –

+0

@OlivierLacan Lesen Sie es zurück, ich denke, Sie könnten richtig sein, obwohl ich jetzt verwirrt bin, warum er meine Antwort akzeptiert, wenn es hat sein Problem nicht gelöst. –