We write about Ruby on Rails, React.js, React Native, remote work, open source, engineering and design.
Rails 6.0 was recently released.
Rails 6 added slice! on ActiveModel::Errors
. With this addition, it becomes quite
easy to select just a few keys from errors and show or return them. Before Rails 6,
we needed to convert the ActiveModel::Errors
object to a hash before slicing the keys.
Let's checkout how it works.
1>> user = User.new
2
3=> #<User id: nil, email: nil, password: nil, created_at: nil, updated_at: nil>
4
5>> user.valid?
6
7=> false
8
9>> user.errors
10
11=> #<ActiveModel::Errors:0x00007fc46700df10 @base=#<User id: nil, email: nil, password: nil, created_at: nil, updated_at: nil>, @messages={:email=>["can't be blank"], :password=>["can't be blank"]}, @details={:email=>[{:error=>:blank}], :password=>[{:error=>:blank}]}>
12
13>> user.errors.slice!
14
15=> Traceback (most recent call last):
16 1: from (irb):16
17NoMethodError (undefined method 'slice!' for #<ActiveModel::Errors:0x00007fa1f0e46eb8>)
18Did you mean? slice_when
19
20>> errors = user.errors.to_h
21>> errors.slice!(:email)
22
23=> {:password=>["can't be blank"]}
24
25>> errors
26
27=> {:email=>["can't be blank"]}
1>> user = User.new
2
3=> #<User id: nil, email: nil, password: nil, created_at: nil, updated_at: nil>
4
5>> user.valid?
6
7=> false
8
9>> user.errors
10
11=> #<ActiveModel::Errors:0x00007fc46700df10 @base=#<User id: nil, email: nil, password: nil, created_at: nil, updated_at: nil>, @messages={:email=>["can't be blank"], :password=>["can't be blank"]}, @details={:email=>[{:error=>:blank}], :password=>[{:error=>:blank}]}>
12
13>> user.errors.slice!(:email)
14
15=> {:password=>["can't be blank"]}
16
17>> user.errors
18
19=> #<ActiveModel::Errors:0x00007fc46700df10 @base=#<User id: nil, email: nil, password: nil, created_at: nil, updated_at: nil>, @messages={:email=>["can't be blank"]}, @details={:email=>[{:error=>:blank}]}>
Here is the relevant pull request.