This blog is part of our Rails 6 series. 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.

Rails 5.2

>> 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" ]}

Rails 6.0.0.beta2

>> 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.