6

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

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

    module MyEngine
      class FormController < ApplicationController
        load_and_authorize_resource
        ...
      end
    end

我收到此错误:

    uninitialized constant Form

我的猜测是,自动加载程序load_and_authorize_resource与我的 MainApp 命名空间相关联,并且无法识别我在不同的命名空间中调用它,因此调用类似Form.find(params[:id])而不是MyEngine::Form.find(params[:id]).

如果是这种情况,我该如何解决?这不是什么大问题,因为authorize!仍然可以正常工作,所以我可以在每个操作中单独定义授权,但是如果我能够使用该load_and_authorize_resource方法,感觉会更干净。

4

3 回答 3

9

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

load_and_authorize_resource class: MyEngine::Form
于 2012-08-21T17:14:53.357 回答
6

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

def namespace
  @params[:controller].split("::")[0..-2]
end

如您所见,它尝试拆分控制器路径,::但它以my_engine/my_controller.

所以修复很简单:

def namespace
  @params[:controller].split("/")[0..-2]
end

想知道他们怎么会错过这么长时间的愚蠢错误。应向他们发送拉取请求。

PS 刚报名回答 8)

于 2013-03-01T20:25:51.463 回答
3

如果模型类的命名空间与控制器不同,则需要指定该:class选项。

module MyEngine
  class FormController < ApplicationController
    load_and_authorize_resource :class => MyEngine::Form
    ...
  end
end
于 2012-08-22T08:32:22.607 回答