Ich schreibe oft Folgendes:
params.delete(:controller)
params.delete(:action)
params.delete(:other_key)
redirect_to my_path(params)
Die Spur der Löschungen fühlt sich nicht richtig an und auch nicht:
[:controller, :action, :other_key].each do |k|
params.delete(k)
end
Gibt es etwas einfacheres und saubereres?
ruby-on-rails
ruby
Mark Westling
quelle
quelle
Hash#except!
aberHash#except
der richtige Weg ist (spielen Sie nicht mitparams
!). Als Faustregel gilt, dass Sie mit keinem Objekt an Ort und Stelle herumspielen dürfen, es sei denn, dies ist unbedingt erforderlich. Die Nebenwirkungen können zu unerwarteten Ergebnissen führen.Antworten:
Ich vermute, Sie kennen die Hash-Nummer nur Methode, die ActiveSupport zu Hash hinzufügt.
Dadurch kann Ihr Code vereinfacht werden, um:
Außerdem müssten Sie keinen Affen-Patch ausführen, da das Rails-Team dies für Sie erledigt hat!
quelle
except!
tat es. Rails 3.0User.attributes.except("id", "created_at", "updated_at")
Symbole funktionierten nichtattributes
gibt die ActiveRecord- Methode aHash
mit Schlüsseln zurück, die sindString
. Dann müssten Sie also String-Schlüsselnamen in verwenden.except()
. Ich komme jedoch mit demHash.symbolize_keys
a la@user.attributes.symbolize_keys.except(:password, :notes)
- usingsymbolize_keys
Beachten Sie bei der Verwendung
Hash#except
Ihres Problems, dass dadurch potenzielle Sicherheitsprobleme auftreten . Eine gute Faustregel für den Umgang mit Daten von Besuchern ist die Verwendung eines Whitelist-Ansatzes. In diesem Fall mitHash#slice
stattdessen.quelle
{:b=>2, :c=>3}:Hash
Ich wäre mit dem Code, den Sie ursprünglich in Ihrer Frage gepostet haben, völlig zufrieden.
quelle
Hash
Eine andere Möglichkeit, die Antwort von dmathieu zu formulieren, könnte sein
quelle
Einen Affenfeld anfeuern?
quelle
delete(k)
statt seindelete(key)
delete_keys
einfach seindup.delete_keys!(*keys)
Ich weiß nicht, was Ihrer Meinung nach mit Ihrer vorgeschlagenen Lösung falsch ist. Ich nehme an, Sie wollen eine
delete_all
Methode für Hash oder so? Wenn ja, bietet Tadmans Antwort die Lösung. Aber ehrlich gesagt, für eine einmalige Sache denke ich, dass Ihre Lösung extrem einfach zu befolgen ist. Wenn Sie dies häufig verwenden, möchten Sie es möglicherweise in eine Hilfsmethode einbinden.quelle