2011-01-12 36 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

相關問題