2011-03-01 91 views
3

我正試圖實現功能,其中一旦設置屬性就無法在ActiveRecord模型上進行更改。爲此,我寫了以下方法:在ActiveRecord中標記無效屬性

def address 
self[:address] 
end 

def address=(val) 
if new_record? 
    self[:address] = val 
else 
    errors.add(:address, "Cannot change address, once it is set") 
    return false # tried return nil here first, did not work 
end 
end 

我在這裏做錯了什麼嗎?我想要的對象是無效的,一旦我嘗試更改地址,但我沒有得到任何錯誤,當我這樣做obj.valid?

編輯:一旦設置它的值不會更改,但我想獲得無效的對象當我通過obj.valid進行驗證時?

回答

8

當您執行obj.valid?時,它將清除所有錯誤,然後依次運行每個驗證。爲了在驗證時產生錯誤,您必須將該邏輯移入驗證塊。

這裏的一種方式爲例做與一個實例變量:

def address=(val) 
    if new_record? 
    self[:address] = val 
    else 
    @addr_change = true 
    return false # tried return nil here first, did not work 
    end 
end 

validate do |user| 
    errors.add(:address, "Cannot change address, once it is set") if @addr_change 
end 
+0

咄!我應該想到這一點。謝謝! – rmk 2011-03-01 20:08:10

+0

沒問題。我爲後代添加了一個代碼示例,以防其他人來問相同的問題。 :-) – Benson 2011-03-01 20:26:43

+0

謝謝謝謝謝謝!這是我爲我的遺留項目尋找好幾個小時。 – rendon 2015-01-31 20:43:48