ruby-on-rails - form - render rails
Ruby on Rails: elimina mĂșltiples claves hash (6)
A menudo me encuentro escribiendo esto:
params.delete(:controller)
params.delete(:action)
params.delete(:other_key)
redirect_to my_path(params)
El camino de las eliminaciones no se siente bien y tampoco lo hace:
[:controller, :action, :other_key].each do |k|
params.delete(k)
end
¿Hay algo más simple y más limpio?
¿Arranca un parche de mono?
class Hash
def delete_keys!(*keys)
keys.flatten.each do |k|
delete(k)
end
self
end
def delete_keys(*keys)
_dup = dup
keys.flatten.each do |k|
_dup.delete(k)
end
_dup
end
end
Estaría completamente satisfecho con el código que publicaste originalmente en tu pregunta.
[:controller, :action, :other_key].each { |k| params.delete(k) }
Mientras usa el Hash#except
maneja su problema, tenga en cuenta que presenta posibles problemas de seguridad . Una buena regla empírica para manejar cualquier información de los visitantes es utilizar un enfoque de lista blanca. En este caso, usando Hash#slice
lugar.
params.slice!(:param_to_remove_1, :param_to_remove_2)
redirect_to my_path(params)
No sé lo que piensas que está mal con tu solución propuesta. Supongo que quieres un método delete_all
en Hash o algo así? Si es así, la respuesta de tadman proporciona la solución. Pero francamente, por una sola vez, creo que su solución es extremadamente fácil de seguir. Si está utilizando esto con frecuencia, es posible que desee envolverlo en un método de ayuda.
Otra forma de expresar la respuesta de Dmathieu podría ser
params.delete_if { |k,v| [:controller, :action, :other_key].include? k }
Supongo que desconoce el Hash#except método que ActiveSupport agrega a Hash.
Permitiría que su código se simplifique a:
redirect_to my_path(params.except(:controller, :action, :other_key))
Además, no tendrías que hacer el parche de mono, ¡ya que el equipo de Rails lo hizo por ti!