在我的应用程序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。
答案 0 :(得分:23)
self
的使用通常是强制Ruby将其识别为方法调用,而不是将其误解为变量。如果没有一个名为day=
的方法的先验知识,那么day = "x"
就像一个变量赋值一样看待Ruby。 self.day = "x"
始终是方法调用。
这是麻烦的原因是因为在解析了User类文件后动态添加了name
和name=
方法。 Rails在使用模型时所做的第一件事就是为相关的数据库字段创建方法,但这会在解析user.rb
文件后发生。