关于Cancancan自动调用program_params方法的原理咨询
问题解答
这不是CanCanCan的机制导致的,核心原因出在Rails自身的控制器逻辑或你可能使用的资源类控制器库上:
如果你的
ProgramsController是通过Rails脚手架(scaffold)生成的,默认的create方法里会显式调用program_params来传递强参数,代码大概长这样:def create @program = Program.new(program_params) respond_to do |format| if @program.save format.html { redirect_to @program, notice: 'Program was successfully created.' } format.json { render :show, status: :created, location: @program } else format.html { render :new, status: :unprocessable_entity } format.json { render json: @program.errors, status: :unprocessable_entity } end end end你可能之前没注意到这段代码里的
program_params调用。要是你的控制器继承了
InheritedResources::Base这类第三方库,它会自动推断资源对应的强参数方法——命名规则是#{资源名}_params,也就是这里的program_params,无需你手动写调用逻辑。
CanCanCan的职责是权限校验和自动加载实例(比如new/index里的@program),它不会自动触发强参数方法的调用。当你修改program_params的名称后,原来依赖这个命名的代码(脚手架生成的或第三方库的自动逻辑)找不到对应方法,自然就不再调用了。
内容的提问来源于stack exchange,提问作者Muhammad Aamir Khan
相关产品推荐
相关产品推荐

