Ruby中是否有slice函数的相反函数?

51
在这篇帖子中,使用了slice函数来获取params中仅必要的元素。那么我应该使用什么函数来排除params中的一个元素(比如user_id)?
Article.new(params[:article].slice(:title, :body))

谢谢。

4个回答

85

使用except方法:

a = {"foo" => 0, "bar" => 42, "baz" => 1024 }
a.except("foo")
# returns => {"bar" => 42, "baz" => 1024}

22
值得注意的是,except 是 Rails 添加的一个方法,在单独使用 Ruby 时通常不可用。 - Wes Foster
7
Ruby 3 新增了 Hash 的 except 方法。详情请见此处 - nates

4

受到除了Rails的ActiveSupport源代码的启发

您可以在不需要active_support/core_ext/hash/except的情况下执行相同的操作

# h.slice( * h.keys - [k1, k2...] )

# Example:
h = { a: 1, b: 2, c: 3, d: 4 }
h.slice( * h.keys - [:b, :c] ) # => { a: 1, d: 4}

注意:Ruby 3+的哈希表中已经包含了except方法:
# Ruby 3+
h.except(:b, :c) # => { a: 1, d: 4}

1
我知道应该有一些巧妙的技巧,尽管使用 Ruby 3+ 并不需要它。 - akostadinov
@akostadinov,谢谢您的提示。我会添加一条关于Ruby 3+的注释。 - jgomo3

2

仅考虑标准的Ruby。

对于低于3版本的Ruby,不行。

对于Ruby 3,可以。您可以使用except


1

试试这个

params = { :title => "title", :other => "other", :body => "body"  }

params.select {|k,v| [:title, :body].include? k  } #=> {:title => "title", :body => "body"}  

2
至少这是Ruby。公平地说,slice和except都是Rails方法。 - Eben Geer
Slice 是 Ruby 中的一个功能,对于其他部分你是正确的。 - Dennis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接