Ruby on Rails:删除多个哈希键

时间:2009-10-13 14:25:04

标签: ruby-on-rails ruby

我经常发现自己在写这个:

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

有什么更简单,更清洁的吗?

6 个答案:

答案 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提供了解决方案。但坦率地说,对于一次性,我认为您的解决方案非常容易理解。如果您经常使用它,您可能希望将其包装在辅助方法中。