2015-11-03 20 views
0

我想確保用戶不能對帖子發表評論兩次。我可以通過模型驗證或CanCan做到這一點。我認爲這將是很好用的康康舞做,因爲這樣我可以做類似如下:驗證CanCanCan的唯一性是錯誤的嗎?

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

但是隨後在我ability.rb我有這樣的事情,這感覺怪怪的:

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

回答

1

雖然這也許是可能使用cancancan以及實現的,你最好使用模型驗證做多的理由相同。

  • 通過使用後者,您將授權邏輯與數據庫驗證邏輯分開。
  • 比方說,你最終不得不在未來不同的角色(不是user等),新角色不會有上發佈評論同樣的限制。您將不得不再次寫入ability.rb中的邏輯,這違背了DRY原則。
  • 當用戶試圖創建第二個評論,他們會得到一個錯誤403,而不是一個400這將在這種情況下,可以預期的。
  • 通過這些驗證,檢查的正確抽象,單元測試也將在一個更合理的方式組織。