2011-01-12 72 views
4

我刚才说康康舞1.5.0到我的Rails应用程序3这里是我的能力文件 -Rails3中 - 康康舞 - 未初始化的常量能力::页面

def initialize(user) 
user ||= User.new 

if user.role == 'Admin' 
    can :manage, :all 
end 
if user.role == 'Standard' 
    can :manage, Library 
    can :manage, Page 
else 
    can :manage, Page 
    can :manage, Library 
end 

我有一个自定义类(非宁静函数)

class PagesController < ApplicationController 
authorize_resource :class => false 

def home 
end 
end 

正如你可以看到我使用正确的函数的不宁静的类,但我仍然得到这个错误 -

uninitialized constant Ability::Page 

这里是堆栈跟踪的开始 -

app/models/ability.rb:16:in `initialize' 
cancan (1.5.0) lib/cancan/controller_additions.rb:327:in `new' 
cancan (1.5.0) lib/cancan/controller_additions.rb:327:in `current_ability' 
cancan (1.5.0) lib/cancan/controller_additions.rb:308:in `authorize!' 
cancan (1.5.0) lib/cancan/controller_resource.rb:40:in `authorize_resource' 
cancan (1.5.0) lib/cancan/controller_resource.rb:9:in `block in add_before_filter' 
activesupport (3.0.3) lib/active_support/callbacks.rb:436:in ` _run__1386450187816505438__process_action__15559788756486462__callbacks' 
activesupport (3.0.3) lib/active_support/callbacks.rb:409:in `_run_process_action_callbacks' 
activesupport (3.0.3) lib/active_support/callbacks.rb:93:in `run_callbacks' 

谢谢,亚历克斯

回答

8

的惭惭文档描述can方法为:

can方法用于定义权限和需要两个参数。第一个是您设置权限的操作,第二个是您设置的对象类。

因此,问题在于您的系统中没有Page类,CanCan无法管理其访问权限。该康康舞建成

注:(由我强调)

授权库,Ruby on Rails的制约什么资源给定用户被允许访问。

所以,如果你的目标是控制不重视他们的轨道资源抽象的概念,那么你可能有一个艰难的时间与惨惨

+0

感谢您的建议,多数民众赞成在清除! – Alex 2011-01-12 17:09:41

+0

我知道这是旧的,但@Alex,你是怎么决定清理它的?我有一个非RESTful控制器,有几个日志记录操作。我得到了缺少模型类的“未初始化的常量”异常。 – 2013-11-13 05:25:53

6

只是说明任何人现在发现这一点。 ..

可以授权任何非RESTful控制器,抽象类和方法..

实施例:

/app/models/role_ability.rb

class RoleAbility 
    def initialize(user) 
    user ||= User.new 

    if user.role == 'Admin' 
     can :manage, Post  # some existing resource_authorisation 
     can :do_this, :on_this # authorizing a non resource  
    end 
    end 
end 

:do_this和:on_this完全是任意的,但它们必须匹配授权! PARAMS在像这样的控制器......

class Controller < ApplicationController 
    def some_abstract_method 
     ### Awesome method code goes here 

     authorize! :do_this, :on_this 
    end 
end 

只要记住,机会是你可能已经有一些资源授权从内ApplicationController的发生,也许这样

class ApplicationController 
    authorize_resource || authorize! :admin, Object || load_and_authorize_resource etc 
end 

所以记得在你不给skip_authorize_resource -restful /抽象控制器

class AbstractController < ApplicationController 

    skip_authorize_resource 

    def some_abstract_method 
     authorize! :do_this, :on_this 
    end 
end 

现在,管理员可以:do_this,:on_this和将很好地授权。你可能想要将这个能力命名为更多的语义,只是想强调任意性。

这是全部使用康佳1.5,还没有尝试过的任何事情。

https://github.com/ryanb/cancan/wiki/Non-RESTful-Controllers