Je me retrouve souvent à écrire ceci:
params.delete(:controller)
params.delete(:action)
params.delete(:other_key)
redirect_to my_path(params)
La traînée de suppressions ne semble pas juste et non plus:
[:controller, :action, :other_key].each do |k|
params.delete(k)
end
Y a-t-il quelque chose de plus simple et de plus propre?
ruby-on-rails
ruby
Mark Westling
la source
la source
Hash#except!
maisHash#except
c'est la voie à suivre (ne vous embêtez pasparams
!). En règle générale, ne gâchez aucun objet en place à moins que cela ne soit absolument nécessaire, les effets secondaires peuvent avoir des résultats inattendus.Réponses:
Je suppose que vous n'êtes pas au courant du Hash # sauf la méthode qu'ActiveSupport ajoute à Hash.
Cela permettrait à votre code d'être simplifié pour:
De plus, vous n'auriez pas besoin de patch monkey, puisque l'équipe Rails l'a fait pour vous!
la source
except!
fait. Rails 3.0User.attributes.except("id", "created_at", "updated_at")
symboles ne fonctionnaient pasattributes
méthode ActiveRecord retourne unHash
avec des clésString
. Vous devrez donc utiliser des noms de clé de chaîne dans.except()
. Cependant, je contourne cela en utilisant leHash.symbolize_keys
a la@user.attributes.symbolize_keys.except(:password, :notes)
- en utilisant lesymbolize_keys
fait que cela fonctionne comme on pouvait s'y attendreLorsque vous utilisez
Hash#except
gère votre problème, sachez que cela présente des problèmes de sécurité potentiels . Une bonne règle de base pour gérer les données des visiteurs consiste à utiliser une approche de liste blanche. Dans ce cas, utilisez à laHash#slice
place.la source
{:b=>2, :c=>3}:Hash
Je serais entièrement satisfait du code que vous avez initialement publié dans votre question.
la source
Hash
c'est la meilleure réponse: +1:Une autre façon de formuler la réponse de dmathieu pourrait être
la source
Allumez un patch de singe?
la source
delete(k)
place dedelete(key)
delete_keys
devrait être simplementdup.delete_keys!(*keys)
Je ne sais pas ce qui ne va pas avec la solution que vous proposez. Je suppose que vous voulez une
delete_all
méthode sur Hash ou quelque chose? Si tel est le cas, la réponse de Tadman fournit la solution. Mais franchement, pour une seule fois, je pense que votre solution est extrêmement facile à suivre. Si vous l'utilisez fréquemment, vous voudrez peut-être l'envelopper dans une méthode d'assistance.la source