2012-09-09 40 views
6

我想創建一個自定義驗證函數,只有當數據庫中的當前字段不爲空時,纔會允許字段被保存爲空/零。如何在驗證函數中訪問數據庫值(舊值)?我可以使用self.name_of_field訪問新值。Rails:在編輯驗證過程中比較舊值和新值

這就是我現在所擁有的

validate :image_remote_url_change 
    def image_remote_url_change 
    if self.image_remote_url.blank? and self.image_remote_url_changed? 
     errors.add(:field, "can't be blank once set") 
     return false 
    end 
    end 

現在,如果我嘗試編輯現有的對象,它不會接受的空一個新的價值,但在創建新對象時,它會說「可以即使舊的價值從未設置過,一旦設置就沒有空白「。

回答

7

您可以利用ActiveModel::Dirty。在您的自定義驗證功能中,您可以檢查字段是否空白以及是否已更改:

validate :custom_validation_function 

def custom_validation_function 
    if self.field.blank? and self.field_changed? 
     errors.add(:field, "can't be blank once set") 
     return false 
    end 
end 
+2

+1。來自Heroku的Schneems有一個[簡要文章](http://schneems.com/post/28425724540/get-previously-saved-changes-in-rails)討論previous_changes方法,它可能也會幫助你。 – stephenmurdoch

+0

Doesn'這只是工作,但如果對象實際上改變?因爲它被成功保存了。我只是在驗證步驟上做這件事 –

+0

@glumbo試一試,看看 – stephenmurdoch