Is there an opposite function of slice function in Ruby?

14.8k Views Asked by At

In this post, slice function is used to get only necessary elements of params. What would be the function I should use to exclude an element of params (such as user_id)?

Article.new(params[:article].slice(:title, :body))

Thank you.

4

There are 4 best solutions below

3
Guillaume On BEST ANSWER

Use except:

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

Try this

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

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

Inspired in the sourcecode of except in Rails' ActiveSupport

You can do the same without requiring 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}

Note: Ruby 3+ Hash incorporated this except method:

# Ruby 3+
h.except(:b, :c) # => { a: 1, d: 4}
0
m26a On

Considering only standard Ruby.

For Ruby versions below 3, no.

For Ruby 3, yes. You can use except.