什么样的域逻辑*不适合*CanCan能力类



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

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

  1. 爱丽丝没有被停职。
  2. 鲍勃向爱丽丝发送了加好友请求。
  3. 爱丽丝和鲍勃还不是朋友。

1 似乎显然很适合 CanCanCan。如果用户被暂停,他们就不能与人交朋友。您甚至可以通过为用户提供"挂起"角色来指定这一点。

2 似乎很合适 - 一个用户向另一个用户授予权限。然而,这难道不是要进入能力类的相当关键的领域逻辑吗?能力是否应该在用户模型上调用can_befriend?方法来确定这一点?

3 对我来说似乎有问题。阻止人们与已经是朋友的人交朋友似乎不是权限问题,而是界面逻辑问题。我们想隐藏"与鲍勃交朋友"按钮,不是因为不允许爱丽丝与鲍勃交朋友,而是因为它不会做任何事情。那么,如果爱丽丝和鲍勃已经是朋友,那么呼唤爱丽丝can?(:befriend, bob)是真的还是假的?如果这个逻辑确实属于能力类,那么什么不属于那里?

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

最新更新