2012-04-12 40 views
11

在整个我的申请self.是没有必要引用一个用户的名字。 name工作正常。为什么使用“self”访问ActiveRecord/Rails模型属性?

为什么下面的代码需要self才能按预期工作?

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 

顺便说一句,我知道validates_presence_of可以用来防止保存,但我想,如果没有名字被赋予一个默认的保存。

Rails 3.0.7。

回答

23

通常使用self是强制Ruby认识到,作为一个方法调用,而不是误解释它作为一个变量。如果事先不知道名为day=的方法,那么day = "x"会将Ruby视为变量赋值。 self.day = "x"始终是一个方法调用。

这是麻烦的原因是因为namename=方法是在用户类文件解析后动态添加的。 Rails在使用模型时所做的第一件事是为关联的数据库字段创建方法,但是在解析user.rb文件后会发生这种情况。

+0

对不起,'self.day'应该是'self.name'!我更新了这个问题。 – 2012-04-12 16:08:19

+6

Nit:Ruby永远不会把'x = y'作为方法调用。它始终是一个直接变量(或常量,取决于具体情况)的分配。形式'x'(如表达式)取决于范围内是否存在这样一个“x”(作为变量)。 – 2012-04-12 16:08:53

+0

如果在解析类文件后动态添加'name'和'name =',那么有时候'name'意味着'self.name',有时候'name'是一个局部变量? – 2012-04-12 16:10:33

相关问题