CanCan:除了MainApp之外的命名空间中的load_and_authorize_resource

Chi*_*aka 6 ruby-on-rails ruby-on-rails-plugins rails-engines cancan

我在我的Rails应用程序中使用CanCan获取权限,我在其中为一些通用表单功能构建了自己的引擎.我想锁定系统中的权限,以便用户无法自由访问我的引擎控制器的操作.这些控制器大多只使用7个REST动作,所以我想load_and_authorize_resource在每个控制器的顶部使用CanCan .

但是,当我像这样编写代码时:

    module MyEngine
      class FormController < ApplicationController
        load_and_authorize_resource
        ...
      end
    end
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

    uninitialized constant Form
Run Code Online (Sandbox Code Playgroud)

我的猜测是,自动装弹机中load_and_authorize_resource被绑定到我的MainApp命名空间,并且不承认,我在不同的命名空间调用它,所以确实喜欢打电话Form.find(params[:id]),而不是MyEngine::Form.find(params[:id]).

如果是这种情况,我该如何解决这个问题?这不是一个大问题,因为authorize!仍然可以正常工作,所以我可以单独定义每个动作中的授权,但如果我能够使用该load_and_authorize_resource方法,它会感觉更清洁.

Yur*_*kyy 8

CanCan找不到命名空间模型.尝试指定类:

load_and_authorize_resource class: MyEngine::Form
Run Code Online (Sandbox Code Playgroud)


小智 6

它似乎是一个错误CanCan::ControllerResource#namespace:

def namespace
  @params[:controller].split("::")[0..-2]
end
Run Code Online (Sandbox Code Playgroud)

如你所见,它试图分割控制器路径,::但它以形式出现my_engine/my_controller.

所以修复很简单:

def namespace
  @params[:controller].split("/")[0..-2]
end
Run Code Online (Sandbox Code Playgroud)

不知道他们怎么会错过这么长时间的这种愚蠢的虫子.应该向他们发送拉取请求.

PS刚刚注册回答8)