覆盖CanCan方法,该方法引发异常'未初始化的常量联系'

时间:2016-08-12 17:21:34

标签: ruby-on-rails ruby cancancan

我有一个联系人控制器,它通过cancancan加载和授权资源:

class ContactsController < ApplicationController
  before_filter :authenticate_user!
  load_and_authorize_resource
end

我的索引操作永远不会被调用,因为只能在名为MongoidContainer的命名空间中访问Contact资源。因此,在我的系统中访问Contact的唯一方法是MongoidContainer :: Contact。因此,当cancancan尝试加载资源时,会引发异常:

module CanCan
  class ControllerResource
    ...
    def resource_class
      case @options[:class]
      when false  then name.to_sym
      when nil    then namespaced_name.to_s.camelize.constantize
      when String then @options[:class].constantize
      else @options[:class]
      end
    end
    ...
  end
end

我试图在ContactsController中覆盖此方法,但永远不会调用覆盖。该模块很可能未包含在ApplicationController命名空间中。我该如何覆盖此方法?

我确实看到了一个选项,表示你可以传递类似这样的类选项:

load_and_authorize_resource class: 'MongoidContainer::Contact'

我真的很好奇为什么在这种情况下不会覆盖该方法。

1 个答案:

答案 0 :(得分:0)

ControllerResource很可能不在控制器的层次结构中,因此在控制器中定义该方法不会做任何事情。

这个类的文件的代码中暗示了这一点。见https://github.com/ryanb/cancan/blob/4560928dc375f9b31de00381c98334eb6aabc4b9/lib/cancan/controller_resource.rb#L2

  

处理加载和授权控制器逻辑,以便我们不会使用非接口方法使所有控制器混乱。

我不是肯定的,但CanCan似乎添加了一个before_filter,然后委托给ControllerResource。

ul{
  list-style:none;
  display:inline;
}
li{
  list-style: none;
  display: inline;
  width:100%;
  padding: 10px;
}
ul.navbar-brand{
  float:left;
}
ul.navbar-right{
  float:right;
}