A menudo me encuentro escribiendo esto:
params.delete(:controller)
params.delete(:action)
params.delete(:other_key)
redirect_to my_path(params)
El rastro de eliminaciones no se siente bien y tampoco:
[:controller, :action, :other_key].each do |k|
params.delete(k)
end
¿Hay algo más simple y más limpio?
ruby-on-rails
ruby
Mark Westling
fuente
fuente
Hash#except!
peroHash#except
es el camino a seguir (¡no se meta conparams
!). Como regla general, no se meta con ningún objeto en su lugar a menos que sea absolutamente necesario, los efectos secundarios pueden tener resultados inesperados.Respuestas:
Supongo que no conoce el Hash # excepto el método que ActiveSupport agrega a Hash.
Permitiría simplificar su código para:
Además, no tendrías que usar el parche de mono, ya que el equipo de Rails lo hizo por ti
fuente
except!
hizo. Rails 3.0User.attributes.except("id", "created_at", "updated_at")
símbolos no funcionaronattributes
método ActiveRecord devuelve unHash
con claves que sonString
. Entonces, tendría que usar nombres de cadena de clave.except()
. Sin embargo, evito esto usandoHash.symbolize_keys
a la@user.attributes.symbolize_keys.except(:password, :notes)
- el uso losymbolize_keys
hace funcionar como uno esperaríaMientras usa
Hash#except
maneja su problema, tenga en cuenta que presenta posibles problemas de seguridad . Una buena regla general para manejar cualquier información de los visitantes es utilizar un enfoque de lista blanca. En este caso, usando en suHash#slice
lugar.fuente
{:b=>2, :c=>3}:Hash
Estaría completamente satisfecho con el código que publicó originalmente en su pregunta.
fuente
Hash
esta es la mejor respuesta: +1:Otra forma de expresar la respuesta de dmathieu podría ser
fuente
¿Encender un parche de mono?
fuente
delete(k)
lugar dedelete(key)
delete_keys
debería ser sencilladup.delete_keys!(*keys)
No sé qué crees que está mal con tu solución propuesta. ¿Supongo que quieres un
delete_all
método en Hash o algo así? Si es así, la respuesta de tadman proporciona la solución. Pero, francamente, para una sola vez, creo que su solución es extremadamente fácil de seguir. Si usa esto con frecuencia, es posible que desee envolverlo en un método auxiliar.fuente