2012-12-30 86 views
1

我沒有成功地在模型中直接驗證重複的url。下面的代碼顯示,當用戶創建一個新的書籤時驗證效果很好。驗證唯一字段時避免重複的優雅解決方案?

validate :url_cannot_be_duplicated_per_user 

def url_cannot_be_duplicated_per_user 
    current_user = User.find(self.user_id) 
    if current_user.bookmarks.any?{|b| b.url.eql? self.url } 
    errors.add(:url, "already added") 
    end 
end 

但問題是驗證防止編輯書籤,因爲編輯它bascially相同的書籤時,將再次通過模型,趕上重複。因此,通過該代碼,更新操作不會發生。

任何想法如何解決它?

PS:我沒把塊,如果別人在控制器首先提交給模型前檢查網址。雖然驗證工作非常正確,但代碼卻很亂。

我控制器

if duplicated? params[:bookmark][:url] 
    flash[:error] = 'This bookmark already added' 
    @bookmark = current_user.bookmarks.build(params[:bookmark]) 
    render 'new' 
else 

回答

2

您可以驗證uniquenessscope

class Bookmark < ActiveRecord::Base 
    validates :url, :uniqueness => {:scope => :user_id} 
end 
+0

你能給我有關驗證的完整鏈接,我不能在軌道文檔 –

+1

找到的是[這]( http://apidock.com/rails/ActiveModel/Validations/ClassMethods/validates)你在找什麼?有了'validates:something,:uniqueness => [true或者某些選項]',你可以使用[validates_uniqueness_for]中的任何選項,如[在這裏]找到的那樣(http://api.rubyonrails.org/classes/ActiveRecord/Validations /ClassMethods.html#method-i-validates_uniqueness_of)。 – PinnyM