我有一个联系人控制器,它通过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'
我真的很好奇为什么在这种情况下不会覆盖该方法。
答案 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;
}