2010-12-19 62 views
0

我沒有在網上找到任何好的示例,所以我問一個簡單的問題,我期望得到一個簡單的答案。要溫柔。 :)使用模型進行自定義驗證:保存失敗

我有一個Post模型。

p = Post.find(1) 
p.title = "This is the Title of this Article" 
p.url_title = "this-is-the-title-of-this-article--created-by-user-name" 

當郵政創建後,我創建:url_title基於標題。這就是我在數據庫中關閉它的方式,而不是公開那些無聊和不具描述性的ID。

我在before_save中構建了這個url_title,這就是爲什麼我不能簡單地使用'validates_uniqueness_of',因爲它看起來像驗證在before_save開始之前完成,並且有一個:url_title來驗證。

所以,我需要確保:url_title是唯一的。我追加了「--created-by - #{p.user.name}」以允許來自不同用戶的多個相同標題的使用。

所以,我需要做的是自定義驗證,確認:url_title在保存前是數據庫唯一的,如果它不是唯一的,則會引發錯誤並通知用戶。

有關最佳方式的想法? '

回答

1

使用此創建u​​rl_title

before_validation_on_create :create_url_title 

.... 

private 

def create_url_title 
    url_title = ..... 
end 

然後添加適當的驗證,以url_title

validate_uniqueness_of :url_title, :message => "This title is taken, please choose a different title" 
0

中郵模型

+0

哎呀。我忽略了一個重要部分。看到我修改後的帖子。 – 2010-12-19 17:40:49

2

您可以將您的回調擺脫before_savebefore_validation(見here)只需添加

validates_uniqueness_of :url_title 

。此回調將在創建和更新操作上運行,所以我認爲這將足以滿足您的需求。