2011-05-27 180 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