2012-04-12 67 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

相關問題