我确实成功地直接在模型中验证了重复的 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 else 在提交给模型之前先检查 url。尽管验证工作非常正确,但代码变得混乱。
我的控制器
if duplicated? params[:bookmark][:url]
flash[:error] = 'This bookmark already added'
@bookmark = current_user.bookmarks.build(params[:bookmark])
render 'new'
else