rails form different application ruby-on-rails ruby

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!