Why use "self" to access ActiveRecord/Rails model properties?
Throughout my application self.
is not necessary to refer to a User's name. name
works fine.
Why does the following code require self
to work as intended?
class User< ActiveRecord::Base
before_save :validate_name
def validate_name
if self.name.nil? || self.name.empty?
self.name= "Mr. No Name"
end
end
By the way, I know that validates_presence_of
can be used to prevent the save, but I want to save with a default if no name is given.
Rails 3.0.7.
Solution 1:
Often the use of self
is to force Ruby to recognize that as a method call and not mis-interpret it as a variable. Without prior knowledge of a method called day=
, then day = "x"
looks to Ruby like a variable assignment. self.day = "x"
is always a method call.
The reason this is trouble is because the name
and name=
methods are added dynamically after the User class file has been parsed. The first thing Rails does when using a model is make methods for the associated database fields, but this happens after your user.rb
file is parsed.