in the callback why I must use self

R

Raj Singh

class User < ActiveRecord::Base
def before_save
self.name1 = fname + ' ' + lname
name2 = fname + ' ' + lname
end
end


In the callback I am using self for name1 and NOT using self for name2.
When a record is saved in the database I get proper value for name1 but
not for name2. Question is why?


In my judgement before name2 whether I use self or not should not matter
because there is an implicit self when there is no receiver. Then why
the difference in behavior?
 
J

Jason Roelofs

class User < ActiveRecord::Base
def before_save
self.name1 = fname + ' ' + lname
name2 = fname + ' ' + lname
end
end


In the callback I am using self for name1 and NOT using self for name2.
When a record is saved in the database I get proper value for name1 but
not for name2. Question is why?


In my judgement before name2 whether I use self or not should not matter
because there is an implicit self when there is no receiver. Then why
the difference in behavior?

The issue here is that the parser can't tell the difference between
calling the method #name2= or creating a new local variable named
"name2"

In this case, the proper course of action is to use "self.name2 = " to
make sure there is no confusion.

Jason
 
R

Rob Biedenharn

The issue here is that the parser can't tell the difference between
calling the method #name2= or creating a new local variable named
"name2"

In this case, the proper course of action is to use "self.name2 = " to
make sure there is no confusion.

Jason


...and the reason Ruby can't has to do with the dynamic way that
ActiveRecord provides model attributes. Ruby can't introspect on the
object to find that name2= exists so it is quite happy with calling
name2 a local variable. If you used name2 on the first line
(self.name1 = fname + name2) then Ruby would have to assume that name2
is a method since it would otherwise be an undefined local variable.
(I don't know if it would then find name2= for the next line, but I
suspect not. That would be easy for you to try anyway.)

-Rob

Rob Biedenharn http://agileconsultingllc.com
(e-mail address removed)
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,770
Messages
2,569,583
Members
45,073
Latest member
DarinCeden

Latest Threads

Top