Catch validation errors from Model.update(params[:object].keys, params[:object].values)


#1

Hi there

I’m trying to update three records at a time with params coming back
from an HTML form. The form is set up fine and the params hash is
coming back in a form ready to use:

Model.update(params[:object].keys, params[:object].values)

However, I can’t catch the validation errors if the objects aren’t
updated.

In my controller I have this:

if Discount.update(params[:discounts].keys, params
[:discounts].values)
flash[:notice_good] = “Discounts have been updated”
redirect_to :action => ‘index’
else
flash[:notice_bad] = “Couldn’t update discounts”
redirect_to :action => ‘index’ and return false
end

I have <%= error_messages_for :discount %> in my view but can’t seem
to display any validation errors.

Furthermore, it seems that my condtional “if Discount.update […]
etc” fails if there are any errors in saving the updated data to the
database.

Any clues on how to properly use Model.update with a params hash would
be appreciated.

Richard


#2

On 25 Mar., 04:35, bongoman removed_email_address@domain.invalid wrote:

I have <%= error_messages_for :discount %> in my view but can’t seem
to display any validation errors.

Furthermore, it seems that my condtional “if Discount.update […]
etc” fails if there are any errors in saving the updated data to the
database.

Any clues on how to properly use Model.update with a params hash would
be appreciated.

I don’t see why this should be working at all. If you take a look at
the documentation for ActiveRecord::Base.update (http://
api.rubyonrails.org/classes/ActiveRecord/Base.html#M002215) it takes
two arguments. id and attributes, so you should really be calling the
method like this:

if Discount.update(params[:id], params[:discounts])
flash[:notice_good] = “Discounts have been updated”
redirect_to :action => ‘index’
else
flash[:notice_bad] = “Couldn’t update discounts”
redirect_to :action => ‘index’ and return false
end

Furthermore, you need to save the model in an instance variable in
order to display any error messages, and error messages will not be
saved from request to request, so you need to do a render instead of a
redirect:

@discount = Discount.find(params[:id])
if @discount.update(params[:discount])
flash[:notice] = “Discounts have been updated”
redirect_to :action => “index”
else
render :action => “new”
end

Put <%= error_messages_for :discount %> in new.html.erb.

I can recommend the book “Agile Web D. with Rails” from
Pragmatic Programmers to get started with Rails and get the hang of
all the concepts of the framework.


Best regards,
David K.
http://twitter.com/rubyguy


#3

On Mar 25, 7:08 am, “removed_email_address@domain.invalid” removed_email_address@domain.invalid wrote:

Model.update(params[:object].keys, params[:object].values)
else

Any clues on how to properly use Model.update with a params hash would
be appreciated.

I don’t see why this should be working at all. If you take a look at
the documentation for ActiveRecord::Base.update (http://
api.rubyonrails.org/classes/ActiveRecord/Base.html#M002215) it takes
two arguments. id and attributes, so you should really be calling the
method like this:

Read the docs again. It can update multiple objects and there;s even
an example in the docs.
update will return an array of the activerecord objects that it tried
to update, you can iterate over those and display errors for them, eg

error_message_for ‘discount’, :object =>
some_array_of_active_recored_objects

You don’t want to redirect though.

Fred