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#exceptes 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 funcionaronattributesmétodo ActiveRecord devuelve unHashcon claves que sonString. Entonces, tendría que usar nombres de cadena de clave.except(). Sin embargo, evito esto usandoHash.symbolize_keysa la@user.attributes.symbolize_keys.except(:password, :notes)- el uso losymbolize_keyshace funcionar como uno esperaríaMientras usa
Hash#exceptmaneja 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#slicelugar.fuente
{:b=>2, :c=>3}:HashEstaría completamente satisfecho con el código que publicó originalmente en su pregunta.
fuente
Hashesta 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_keysdebería ser sencilladup.delete_keys!(*keys)No sé qué crees que está mal con tu solución propuesta. ¿Supongo que quieres un
delete_allmé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