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.