用CanCanCan验证唯一性是错误的吗?

时间:2015-11-03 23:34:59

标签: ruby-on-rails-4 access-control cancancan

我想确保用户无法对帖子发表评论两次。我可以使用模型验证或CanCan来完成此操作。我认为使用CanCan做它会很好,因为我可以做类似以下的事情:

- if can?(:create, Comment)
  = render 'comments/form'

然而,在我的能力.rb我有这样的事情,这感觉很奇怪:

can :create, Comment do |comment|
  comment.user_id == user.id && !user.comments.exist?(post_id: comment.post_id)
end

1 个答案:

答案 0 :(得分:1)

尽管使用cancancan也可以实现这一目标,但出于多种原因,最好使用模型验证来做同样的事情。

  • 通过使用后者,您将授权逻辑与数据库验证逻辑分开。
  • 假设您将来最终拥有一个不同的角色(user除外),新角色对发布评论的限制不会相同。你必须再次在ability.rb中编写逻辑,这违反了DRY原则。
  • 当用户尝试创建第二条评论时,他们会收到403错误,而不是400错误,在这种情况下会发生错误。
  • 通过适当抽象这些验证检查,您的单元测试也将以更明智的方式进行组织。