Ruby on rails 在Cancan或模型验证中写入规则?

Ruby on rails 在Cancan或模型验证中写入规则?,ruby-on-rails,validation,activerecord,cancan,Ruby On Rails,Validation,Activerecord,Cancan,更新:阅读答案后,我想我应该重新表述我的问题(如问题3) 有时,我会对应该在哪里编写条件检查感到困惑:是在Cancan能力中还是在ActiveRecord模型验证中 作为第一个示例:假设我有一个可以嵌套的文件夹模型。如果文件夹是父文件夹的唯一子文件夹,我希望阻止删除该文件夹 这可能是模型逻辑(作为before_destroy回调)。然而,我还想隐藏删除按钮(和块控制器动作),这似乎是Cancan的领域 作为第二个示例:我希望防止删除非我所有的文件夹 这需要使用会话中存储的当前用户。我的印象是,会

更新:阅读答案后,我想我应该重新表述我的问题(如问题3)

有时,我会对应该在哪里编写条件检查感到困惑:是在Cancan能力中还是在
ActiveRecord
模型验证中

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

这可能是模型逻辑(作为before_destroy回调)。然而,我还想隐藏删除按钮(和块控制器动作),这似乎是Cancan的领域

作为第二个示例:我希望防止删除非我所有的文件夹

这需要使用会话中存储的
当前用户
。我的印象是,会话相关条件不应触及模型本身,因此这是针对Cancan的。对吗


问题3:

如果删除文件夹需要以下两项:

  • 当前用户是所有者检查(写为Cancan能力)
  • 文件夹不是唯一的子检查(在模型中写为
    可销毁?()
  • Cancan功能是否也应该调用
    model.destroyable?()
    ,或者我应该单独调用
    model.destroyable?()
    (在视图和控制器中)?

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

    这听起来像是授权和业务逻辑的结合。视图帮助程序可能会检查用户
    是否可以?
    删除该资源,以及该资源是否可以
    删除?

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


    这听起来像是授权和业务逻辑的结合。视图帮助程序可能会检查用户
    是否可以?
    删除该资源,以及该资源是否可以
    删除?

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


    对于第二个场景,将CanCan检查放在控制器操作上,以便在没有授权的情况下不能调用destroy操作。它不属于该模型。

    对于第一个示例,我会同时执行两个操作:放置一个before\u destroy回调以防止销毁最后一条记录,并根据CanCan功能显示按钮。仅仅隐藏按钮不会阻止POST请求发送到服务器并删除记录


    对于第二个场景,将CanCan检查放在控制器操作上,以便在没有授权的情况下不能调用destroy操作。它不属于该模型。

    +1明确提到仍然需要服务器端身份验证检查,尽管cancan(ahem)可以使其本质上不可见。这都是相同的(re-ahem)身份验证逻辑。所以对于我编辑的新的第三个问题,你会在cancan能力中调用model.destroyable?()吗?+1明确提到仍然需要服务器端身份验证检查,尽管cancan(ahem)可以使这本质上不可见。这都是相同的身份验证逻辑。所以对于我编辑的新的第三个问题,你会在cancan能力中调用model.destroyable吗?()?