在Cancan中编写规则或模型验证?

时间:2013-04-25 02:13:54

标签: ruby-on-rails validation activerecord cancan

更新: 阅读完答案后,我想我应该重新解释一下我的问题(问题3)

我不时会对应该在哪里写一些条件检查感到困惑:在Cancan能力或ActiveRecord模型验证中?

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

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

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

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


问题3:

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

  1. current_user是所有者检查(写为Cancan能力)
  2. 文件夹不是唯一的子检查(在模型中写为destroyable?()
  3. Cancan能力是否也应该调用model.destroyable?(),还是应该单独调用model.destroyable?()(在视图和控制器中)?

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

对于第一个例子,我会做两个:放一个before_destroy回调来防止破坏最后一条记录,并且还显示基于CanCan能力的按钮。只是隐藏按钮不会阻止POST请求发送到您的服务器并删除记录。

对于第二种情况,将CanCan检查放在控制器操作上,以便在未经授权的情况下无法调用destroy操作。它不属于模型。

相关问题