I have an ActiveRecord model with a field called default_pic. I can’t figure out why the first example DOES NOT work and the second one does, I’m not sure why I need the self Doesn’t Work def set_default_pic default_pic = “d#{(1…8).rand}.gif” save end Works: def set_default_pic self[:default_pic] = “d#{(1…8).rand}.gif” save end
I have an ActiveRecord model with a field called default_pic. I can't figure out why the first example DOES NOT work and the second one does
It's a Ruby syntax thing.
def set_default_pic default_pic = "d#{(1..8).rand}.gif" save end
That sets a local variable named default_pic. In order to call the accessor method, you need to do
self.default_pic = "d#{(1..8).rand}.gif"
There's some page in the pickaxe which describes it. I don't have it beside me, sorry.
Pat
It's also an "ActiveRecord handles attributes with method_missing" thing.
The idiomatic way of doing the same thing would be to use ActiveRecord::Base#update_attribute.
def set_default_pic update_attribute(:default_pic, "d#{(1..8).rand}.gif") end
Or, if this is part of a before_create callback, simply:
def set_default_pic write_attribute(:default_pic, "d#{(1..8).rand}.gif") end
assuming, of course, that you have defined Range#rand somewhere to be a random item from the Range. (If not, perhaps you want (1+rand(8)) instead.)
-Rob
Rob Biedenharn http://agileconsultingllc.com Rob@AgileConsultingLLC.com