Ruby on Rails:删除多个散列键

我经常发现自己写这个:

params.delete(:controller) params.delete(:action) params.delete(:other_key) redirect_to my_path(params) 

删除的path感觉不对,也没有:

 [:controller, :action, :other_key].each do |k| params.delete(k) end 

有什么更简单,更清洁?

我猜你不知道哈希#方法ActiveSupport添加到哈希。

这将允许您的代码被简化为:

 redirect_to my_path(params.except(:controller, :action, :other_key)) 

另外,你不需要猴子补丁,因为Rails团队为你做了!

使用Hash#except处理您的问题,请注意,它会引入潜在的安全问题 。 处理来自访问者的任何数据的一个好的经验法则是使用白名单方法。 在这种情况下,改为使用Hash#slice

 params.slice!(:param_to_remove_1, :param_to_remove_2) redirect_to my_path(params) 

我会完全满意你最初在你的问题中发布的代码。

 [:controller, :action, :other_key].each { |k| params.delete(k) } 

dmathieu的答案的另一种方式可能是

 params.delete_if { |k,v| [:controller, :action, :other_key].include? k } 

发起一个猴子补丁?

 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 

我不知道你提出的解决scheme是怎么回事。 我想你想在哈希或什么的delete_all方法? 如果是这样, 塔德曼的答案提供了解决scheme。 但坦率地说,对于一次性,我认为你的解决scheme非常容易遵循。 如果你经常使用这个,你可能想把它包装在一个辅助方法中。