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

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
bongoman (Guest)
on 2009-03-25 05:36
(Received via mailing list)
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
(Guest)
on 2009-03-25 09:10
(Received via mailing list)
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
Frederick C. (Guest)
on 2009-03-25 11:11
(Received via mailing list)
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
This topic is locked and can not be replied to.