March 26, 2019
This blog is part of our Rails 6 series.
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.
>> user = User.new
=> #<User id: nil, email: nil, password: nil, created_at: nil, updated_at: nil>
>> user.valid?
=> false
>> user.errors
=> #<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}]}>
>> user.errors.slice!
=> Traceback (most recent call last):
1: from (irb):16
NoMethodError (undefined method 'slice!' for #<ActiveModel::Errors:0x00007fa1f0e46eb8>)
Did you mean? slice_when
>> errors = user.errors.to_h
>> errors.slice!(:email)
=> {:password=>["can't be blank"]}
>> errors
=> {:email=>["can't be blank"]}
>> user = User.new
=> #<User id: nil, email: nil, password: nil, created_at: nil, updated_at: nil>
>> user.valid?
=> false
>> user.errors
=> #<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}]}>
>> user.errors.slice!(:email)
=> {:password=>["can't be blank"]}
>> user.errors
=> #<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.
If this blog was helpful, check out our full blog archive.