web-dev-qa-db-ja.com

Ruby on Rails:複数のハッシュキーを削除

私はしばしばこれを書いていることに気づきます:

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

もっとシンプルできれいなものはありますか?

144
Mark Westling

ActiveSupportがハッシュに追加する Hash#except メソッドに気付いていないのではないかと思います。

コードを次のように簡素化できます。

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

また、Railsチームがあなたのためにそれをしたので、あなたはパッチを猿にする必要はありません!

215
Ben Crouse

Hash#exceptを使用すると問題が処理されますが、 潜在的なセキュリティの問題 が導入されることに注意してください。訪問者からのデータを処理するための良い経験則は、ホワイトリストアプローチを使用することです。この場合、代わりにHash#sliceを使用します。

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

あなたが最初に質問に投稿したコードに完全に満足しています。

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

Dmathieuの答えを表現する別の方法は

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

モンキーパッチを起動しますか?

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
8
tadman

提案されたソリューションであなたが間違っていると思うことはわかりません。私はあなたがdelete_allハッシュまたは何かのメソッド?その場合、 tadman's answer が解決策を提供します。しかし、率直に言って、一回限り、あなたの解決策は非常に簡単だと思います。これを頻繁に使用する場合は、ヘルパーメソッドでラップすることをお勧めします。

2
Pesto