RoR : Shortening this code

Hello,

Under Ruby On Rails, I would like to replace

mouvement = Mouvement.find(params[:id])
mouvement.statut = :traite
mouvement.save!

By

Mouvement.update(params[:id], statut =’#{:traite}’")

But this error occurs : undefined method `stringify_keys!’ for “statut =
traite”:String

I don’t understand the meaning of the error. Why does Ruby doesn’t knows
how to convert the symbol :traite to a string representation ?

Even statut =’#{:traite.to_s}’" don’t work

Any help ?

Thank you

Under Ruby On Rails, I would like to replace

This question is probably better asked at the RoR mailing list:
http://lists.rubyonrails.org/mailman/listinfo/rails

Zouplaz wrote:

Mouvement.update(params[:id], statut =‘#{:traite}’")

This isn’t valid, did you mean? (note, the ")
Mouvement.update(params[:id], “statut =‘#{:traite}’”)

The problem is not that Ruby can’t stringify :traite, instead the
problem is that you’ve not read the RoR docs on update() well enough.
Please see:
Peak Obsession

If you’ve read this, you’d change your code to look like this:
Mouvement.update(params[:id], { :statut => ‘traite’ })

Or, better yet
Mouvement.find(params[:id]).update_attribute(:statut, ‘traite’)

Note, Rails will take the symbol and use to_yaml instead of to_s when
it saves the record, so you should explictly change it to a string
yourself before passing it in the update hash.

Zouplaz wrote:

Mouvement.update(params[:id], statut =’#{:traite}’")
Thank you

I can’t tell you exactly, but I can give you a hint. It is converting
:traite to a string. But, you have a mistype somewhere, because you have
an uneven number of double quotes. I’m guessing that when you
pasted/wrote the code in your email, this was obscured.

Mouvement.update(params[:id], statut =’#{:traite}’")
^ ^^

You even have it again:

Even statut =’#{:traite.to_s}’" don’t work
^ ^^

Hope that helps.

-Justin

le 06/10/2006 11:40, eden nous a dit:

The problem is not that Ruby can’t stringify :traite, instead the
problem is that you’ve not read the RoR docs on update() well enough.

You’re right ! I read it the wrong way :wink:

If you’ve read this, you’d change your code to look like this:
Mouvement.update(params[:id], { :statut => ‘traite’ })

Or, better yet
Mouvement.find(params[:id]).update_attribute(:statut, ‘traite’)

Why is the second solution the better one ?

Thank you !

Zouplaz wrote:

Hello,

Under Ruby On Rails, I would like to replace

mouvement = Mouvement.find(params[:id])
mouvement.statut = :traite
mouvement.save!

I like this variant better. The whole point of ActiveRecord is that you
handle the database tables like objects, and the use of
#update_attribute makes the code read more like SQL generator calls
instead of ORM use. YMMV.

David V.

Why is the second solution the better one ?

I guess it’s personal preference. There’s not really any huge
difference between the two methods. It all depends on what the context
is – update() returns the object, and update_attribute() returns
true/false depending on whether the update succeeded or not (minus
validation checks).

ActiveRecord is an ORM that doesn’t feel like an ORM. The fact that
things like #update_attribute and #find_by_sql exist are part of the
reason that I like ActiveRecord. It’s a light wrapper around my
database that lets me get down and dirty with SQL if need to (which
happens quite a bit).

Maybe I’m too pragmatic, but I definitely prefer writing one line of
code to writing 3.