私はしばしばこれを書いていることに気づきます:
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
もっとシンプルできれいなものはありますか?
ActiveSupportがハッシュに追加する Hash#except メソッドに気付いていないのではないかと思います。
コードを次のように簡素化できます。
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
提案されたソリューションであなたが間違っていると思うことはわかりません。私はあなたがdelete_all
ハッシュまたは何かのメソッド?その場合、 tadman's answer が解決策を提供します。しかし、率直に言って、一回限り、あなたの解決策は非常に簡単だと思います。これを頻繁に使用する場合は、ヘルパーメソッドでラップすることをお勧めします。