我确实在模型中成功验证了重复的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
但问题是验证会阻止编辑书签,因为在编辑基本相同的书签时,它会再次通过模型并捕获重复。因此,使用该代码,更新操作永远不会发生。
知道怎么解决吗?
PS:我确实在控制器中放了一个块,以便在提交模型之前先检查网址。尽管验证工作非常正确,但代码仍然很混乱。
我的控制器
if duplicated? params[:bookmark][:url]
flash[:error] = 'This bookmark already added'
@bookmark = current_user.bookmarks.build(params[:bookmark])
render 'new'
else
答案 0 :(得分:2)
您可以使用uniqueness
验证scope
:
class Bookmark < ActiveRecord::Base
validates :url, :uniqueness => {:scope => :user_id}
end