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

但问题是验证阻止编辑书签,因为在编辑它时基本相同的书签,它将再次通过模型并捕获重复。因此,使用该代码,更新操作永远不会发生。

知道如何解决吗?

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
4

1 回答 1

2

您可以uniqueness使用以下方式进行验证scope

class Bookmark < ActiveRecord::Base
  validates :url, :uniqueness => {:scope => :user_id}
end
于 2012-12-30T02:52:04.583 回答