Rails中使用Cancancan时重写父类load_and_authorize_resource的问题
我懂你遇到的这个问题了!当子类继承了带有load_and_authorize_resource的父控制器时,直接在子类里加新的配置确实会和父类的规则冲突——父类的规则会先执行,默认根据控制器名ParticipantsController去查找Participant模型,自然就会报uninitialized constant Participant的错误;而直接用skip_load_and_authorize_resource又会把所有加载授权逻辑都跳过,导致@user为空。
给你一个精准的解决办法,在子类控制器里按这个顺序写:
module Api module Cp class ParticipantsController < CpController # 先跳过父类继承来的默认load_and_authorize_resource规则 skip_load_and_authorize_resource only: [] # 再重新定义针对User模型的加载与授权规则 load_and_authorize_resource class: 'User', instance_name: 'user' # 你的控制器方法写在这里... end end end
为什么这么做?
skip_load_and_authorize_resource only: []这个写法是告诉Cancancan,跳过所有继承自父类的加载授权规则(only: []意味着不限制任何动作,等同于全部跳过),不会影响你后续添加的新规则。- 之后再调用
load_and_authorize_resource class: 'User', instance_name: 'user',就会让Cancancan正确加载@user实例,并且使用User模型对应的权限规则来做授权检查,完全覆盖父类的默认行为。
这样修改后,你就能在ParticipantsController里正常使用@user对象,同时权限验证也会按照User模型的逻辑来执行啦。
备注:内容来源于stack exchange,提问作者Sannan Yousuf
相关产品推荐
相关产品推荐

