1

In meiner Rails 3.2-Anwendung, erhalte ich die params Variable in meinem Controller wie folgt:RoR - Entfernen eines Array-Elements aus Action :: Parameter

params.class   => ActionController::Parameters 
params[:a].class  => ActionController::Parameters 
params[:a][:b].class => Array 
params[:a][:b]  => ['1', '2', '3', '4'] 

Wenn ich versuche, einen Wert in das Array zu löschen, es spiegelt sich nicht richtig.

z.B.

params[:a][:b].delete('1') 
=> "1" 

Aber wenn ich es erneut abfrage, gibt es keine Änderung darin.

params[:a][:b] => ['1', '2', '3', '4'] 

Obwohl, wenn ich es einer Variablen zuweisen, funktioniert es gut.

arr = params[:a][:b] 
arr.delete('1') 
=> "1" 

arr 
=> ['2', '3', '4'] 

Jede Idee, warum es nicht direkt das params Objekt aktualisieren?

+0

Können Sie nur 'params' Werte posten? – dp7

+0

Ich kann das nicht reproduzieren: 'params [: a] [: b] == ['1', '2']; params [: a] [: b] .delete ('1'); params [: a] [: b] == ['1', '2'] '. Mein Verdacht ist, dass Sie etwas Lustiges außer Kraft gesetzt haben, und "Params" macht etwas mehr, als ich erwarte. Können Sie den vollständigen, relevanten Controller-Code veröffentlichen? Idealerweise etwas reproduzierbar. –

+0

Was passiert, wenn Sie 'arr = params [: a] [: b]; arr.delete ('1'); Parameter [: a] [: b] = arr; params [: a] [: b] '? – vitomd

Antwort

2
params[:a][:b].tap { |ary| ary.delete('1') } 
#=> ['2', '3', '4'] 

Um den Wert params[:a][:b] ändern Sie es einen neuen Wert zuweisen wollen würde:

params[:a][:b] = params[:a][:b].tap { |ary| ary.delete('1') } 
+0

Aber was ist der Unterschied zwischen diesem und 'params [: a] [: b] .delete ('1')'? Warum würde Ihr Code funktionieren, wenn letzterer nicht funktioniert? Ich kann das Problem nicht reproduzieren. –

+0

@TomLord feuern Sie die Konsole und sehen Sie den Unterschied;) –

+0

Der * Rückgabewert * unterscheidet sich, sicher. Aber die Mutation des 'params' Hashes ist nicht - was das Wichtigste ist. –

Verwandte Themen