2011-05-27 175 views
1

我在軌中使用虛擬屬性有一些奇怪的問題。虛擬屬性被忽略

這是我的示例模型。

class User < ActiveRecord::Base 
    validates_presence_of :last_name 
    validates_presence_of :first_name 

    def clean! 
    first_name = nil 
    last_name = nil 
    end 
end 

我可以再做:

user = User.first 
user.last_name # => "Smith" 
user.clean! 
user.save # => true 
user.first_name # => "Smith" 

眼下first_name = nil部分被忽略。
任何人都知道爲什麼?

+0

如果你鍵入: 'user.first_name'之前的'user.reload'? – apneadiving 2011-05-27 12:18:11

+0

爲什麼你稱之爲虛擬屬性?它似乎不是。 – apneadiving 2011-05-27 12:19:04

+0

我想你的問題中也有一個錯字,你設置了last_name,然後詢問first_name ...詳細信息...;) – DGM 2011-05-27 13:08:07

回答

3

這不是一個虛擬屬性,它只是一種方法。它不工作,因爲它不知道first_name是函數內的一個方法,並且認爲它是一個變量。使用方法:

def clean! 
    self.first_name = nil 
    self.last_name = nil 
end 

虛擬屬性,OTOH,就像是可以被分配到一個新的表格列:

 
def full_name 
    [first_name, last_name].join(' ') 
end 

def full_name=(name) 
    split = name.split(' ', 2) 
    self.first_name = split.first 
    self.last_name = split.last 
end 

(虛擬屬性從http://railscasts.com/episodes/16-virtual-attributes採取代碼)

+0

寫得不錯:) – apneadiving 2011-05-27 13:17:40

+0

完美,謝謝! – Oleander 2011-05-27 16:46:22