Ruby on Rails:删除多个哈希键

Mar*_*ing 146 ruby ruby-on-rails

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

params.delete(:controller)  
params.delete(:action)  
params.delete(:other_key)  
redirect_to my_path(params)  
Run Code Online (Sandbox Code Playgroud)

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

[:controller, :action, :other_key].each do |k|
  params.delete(k)
end
Run Code Online (Sandbox Code Playgroud)

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

Ben*_*use 216

我猜你没有意识到Hash#,除了方法ActiveSupport添加到Hash.

它将允许您的代码简化为:

redirect_to my_path(params.except(:controller, :action, :other_key))
Run Code Online (Sandbox Code Playgroud)

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

  • 其中一个较少记录的方法.我在提出答案的时候一直在找这样的东西,但却没有看到. (3认同)
  • 关于ActiveRecord属性的Rails 3.2,必须使用字符串作为键吗?即`User.attributes.except("id","created_at","updated_at")`符号不起作用 (3认同)

小智 44

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

params.slice!(:param_to_remove_1, :param_to_remove_2)
redirect_to my_path(params)
Run Code Online (Sandbox Code Playgroud)

  • 只是提醒:ActiveSupport,而不是Ruby本身,提供Hash#slice和#slice!http://as.rubyonrails.org/classes/ActiveSupport/CoreExtensions/Hash/Slice.html (12认同)

Bob*_*man 24

我对您最初在问题中发布的代码感到非常满意.

[:controller, :action, :other_key].each { |k| params.delete(k) }
Run Code Online (Sandbox Code Playgroud)


Mik*_*itz 13

另一种表达dmathieu答案的方法可能是

params.delete_if { |k,v| [:controller, :action, :other_key].include? k }
Run Code Online (Sandbox Code Playgroud)


tad*_*man 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
Run Code Online (Sandbox Code Playgroud)

  • 替换现有功能的猴子补丁*是最后的工具.添加新功能的Monkey补丁是Ruby 101. (15认同)
  • 猴子补丁是最后的工具. (5认同)
  • 应该是`delete(k)`而不是`delete(key)` (4认同)

the*_*tor 6

从Ruby 3.0开始,Hash#except直接支持。这意味着我们不需要主动支持即可访问Hash#except.

\n

来自文档:

\n

哈希# except(*keys) \xe2\x86\x92 哈希

\n

此方法返回一个新的哈希,其中包括原始哈希中除给定键之外的所有内容。

\n

例子:

\n
h = { a: 100, b: 200, c: 300, d: 400 }\nh.except(:a, :d) #=> {:b=>200, :c=>300}\n
Run Code Online (Sandbox Code Playgroud)\n

参考:

\n

https://docs.ruby-lang.org/en/3.0.0/Hash.html#method-i- except

\n