为什么使用“self”访问ActiveRecord / Rails模型属性?

时间:2012-04-12 16:03:25

标签: ruby-on-rails ruby ruby-on-rails-3 validation

在我的应用程序self.中,没有必要引用用户名。 name工作正常。

为什么以下代码要求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。

1 个答案:

答案 0 :(得分:23)

self的使用通常是强制Ruby将其识别为方法调用,而不是将其误解为变量。如果没有一个名为day=的方法的先验知识,那么day = "x"就像一个变量赋值一样看待Ruby。 self.day = "x"始终是方法调用。

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