1

更新: 阅读答案后,我想我应该改写我的问题(作为问题 3)

有时我会困惑我应该在哪里写一些条件检查:Cancan 能力还是ActiveRecord模型验证?

作为第一个示例:假设我有一个可以嵌套的文件夹模型。如果文件夹是父文件夹的唯一子文件夹,我想防止删除该文件夹。

这可能应该是模型逻辑(作为 before_destroy 回调)。但是,我还想隐藏删除按钮(和阻止控制器操作),这似乎是 Cancan 的领域。

作为第二个示例:我想防止删除不属于我的文件夹。

这将需要使用current_user其中存储的会话。我的印象是会话相关条件不应该触及模型本身,所以这是针对 Cancan 的。这是对的吗?


问题 3:

如果删除文件夹同时需要:

  1. current_user 是所有者检查(写为 Cancan 能力)
  2. 文件夹不是唯一的子检查(写在模型中destroyable?()

Cancan 能力也应该调用model.destroyable?(),还是我应该model.destroyable?()单独调用(在视图和控制器中)?

4

2 回答 2

4

IMO Cancan 是关于授权的:是否允许用户根据他们的身份删除给定的资源。基于其他标准限制资源删除不在该权限范围内。

这听起来像是授权和业务逻辑的结合。视图助手可能会检查用户是否can?删除资源以及资源是否为deletable?.

于 2013-04-25T02:19:45.103 回答
1

对于第一个示例,我会同时执行以下操作:放置一个 before_destroy 回调以防止破坏最后一条记录,并根据 CanCan 功能显示按钮。仅隐藏按钮不会阻止将 POST 请求发送到您的服务器并删除记录。

对于第二种场景,在控制器动作上打上CanCan检查,这样就不能擅自调用destroy动作。它不属于模型。

于 2013-04-25T02:24:21.077 回答