我经常发现自己在写这个:
params.delete(:controller)
params.delete(:action)
params.delete(:other_key)
redirect_to my_path(params)
删除的痕迹感觉不对,也没有:
[:controller, :action, :other_key].each do |k|
params.delete(k)
end
有什么更简单,更清洁的吗?
答案 0 :(得分:213)
我猜你没有意识到ActiveSupport为Hash添加的Hash#except方法。
它可以将您的代码简化为:
redirect_to my_path(params.except(:controller, :action, :other_key))
另外,你不需要修补补丁,因为Rails团队为你做了这个!
答案 1 :(得分:44)
使用Hash#except
处理您的问题时,请注意它引入了potential security issues。处理来自访问者的任何数据的一个好的经验法则是使用白名单方法。在这种情况下,请改用Hash#slice
。
params.slice!(:param_to_remove_1, :param_to_remove_2)
redirect_to my_path(params)
答案 2 :(得分:23)
我对您最初在问题中发布的代码感到非常满意。
[:controller, :action, :other_key].each { |k| params.delete(k) }
答案 3 :(得分:12)
另一种表达dmathieu答案的方法可能是
params.delete_if { |k,v| [:controller, :action, :other_key].include? k }
答案 4 :(得分:8)
点燃猴子补丁?
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
答案 5 :(得分:2)
我不知道你认为你提出的解决方案有什么问题。我想你想在Hash上使用delete_all
方法还是什么?如果是这样,tadman's answer提供了解决方案。但坦率地说,对于一次性,我认为您的解决方案非常容易理解。如果您经常使用它,您可能希望将其包装在辅助方法中。