0

为这个相当散漫的问题道歉,但我想不出更好的方式来表达它。我的 Rails 应用程序中有一个具有相当复杂逻辑的能力类,我开始担心我让 CanCan 承担了太多责任。这让我想知道什么时候域逻辑应该或不应该进入能力类的合理经验法则是什么。

一个例子:想象一个简化的社交网络,用户可以在其中互相成为朋友。给定用户 Alice 和 Bob,如果满足以下条件,Alice 可能会成为 Bob 的朋友:

  1. 爱丽丝没有被暂停。
  2. Bob 已向 Alice 发送了一个好友请求。
  3. Alice 和 Bob 还不是朋友。

1 似乎很适合 CanCan。如果用户被暂停,他们将无法与他人交朋友。您甚至可以通过给用户一个“暂停”角色来指定这一点。

2 似乎非常合适 - 一个用户授予另一个用户权限。然而,这不是非常关键的领域逻辑,被划分为一个能力类吗?能力是否应该调用can_befriend?用户模型上的方法来确定这一点?

3对我来说似乎有问题。阻止人们与他们已经是朋友的人成为朋友似乎与其说是权限问题,不如说是接口逻辑问题。我们想要隐藏“成为好友”按钮,不是因为不允许 Alice 与 Bob 成为好友,而是因为它不会做任何事情。那么如果 Alice 和 Bob 已经是朋友了,那么调用 Alice 应该can?(:befriend, bob)返回 true 还是 false 呢?如果这个逻辑确实属于能力类,什么属于那里?

4

1 回答 1

0

我不会把任何东西放在能力上(即使是#1)。这种逻辑属于User#befriend(user)(或任何你称之为的)。我使用功能来定义实际权限:用户不应将照片发布到他们不拥有的相册等。

于 2013-09-18T17:31:55.740 回答