更新: 阅读答案后,我想我应该改写我的问题(作为问题 3)
有时我会困惑我应该在哪里写一些条件检查:Cancan 能力还是ActiveRecord
模型验证?
作为第一个示例:假设我有一个可以嵌套的文件夹模型。如果文件夹是父文件夹的唯一子文件夹,我想防止删除该文件夹。
这可能应该是模型逻辑(作为 before_destroy 回调)。但是,我还想隐藏删除按钮(和阻止控制器操作),这似乎是 Cancan 的领域。
作为第二个示例:我想防止删除不属于我的文件夹。
这将需要使用current_user
其中存储的会话。我的印象是会话相关条件不应该触及模型本身,所以这是针对 Cancan 的。这是对的吗?
问题 3:
如果删除文件夹同时需要:
- current_user 是所有者检查(写为 Cancan 能力)
- 文件夹不是唯一的子检查(写在模型中
destroyable?()
)
Cancan 能力也应该调用model.destroyable?()
,还是我应该model.destroyable?()
单独调用(在视图和控制器中)?