2012-06-05 84 views
1

我正在使用CanCan創建基於角色的管理系統。它是網上商店的一種模板,所以管理員可以在他/她訪問的每個網上商店中扮演不同的角色。例如:在網上商店1他是主持人,在網上商店2他是一名編輯。在CanCan的Ability Class中調用方法時出現NameError

因此,我需要在CanCan的能力類中做的是檢查當前用戶在當前商店(current_shop)中具有什麼樣的角色。我寫了這個:

class Ability 
include CanCan::Ability 

def initialize(admin) 

    if admin.supervise?(current_shop, controller_gsub) 
    can :manage, :all 
    elsif admin.manage?(current_shop, controller_gsub) 
    can :manage, :all 
    elsif admin.access?(current_shop, controller_gsub) 
    can :read, :all 
    end 

end 
end 

的問題是,我似乎無法調用從能力類的current_shop方法,因爲我得到這個錯誤:

undefined local variable or method `current_shop' for #<Ability:0x104df38b0> 

有誰知道如何去了解這個? Thanx提前!

回答

2

實際上,您無法在Ability類中訪問任何控制器方法。 什麼是業務邏輯?如果管理員是current_shop的主管,管理員可以真正管理每一件事情嗎?或者他可能只管理他管理商店的東西?

然後,它會是不錯的不便,如:

class Ability 
include CanCan::Ability 

def initialize(admin) 

    can :manage, :all do |obj| 
    admin.supervise?(obj.shop) || admin.manage?(obj.shop) 
    end 
    can :read, :all do |obj| 
    admin.access?(obj.shop) 
    end 

end 
end 

PS我不是很確定該塊將與:all工作,這是不太符合邏輯的調用.shop在一個未知的類,但是這只是爲了展示方式,很容易列出將使用它的模型

+0

Thanx爲您的答案!我現在正在工作;)業務邏輯:管理員可以爲店鋪中的每個模型分配不同的角色,併爲每個店鋪分配不同的角色。因此,他/她可以在店鋪1中擔任「訂單」的主管,並且只在店鋪2中擁有「訂單」的讀者。:) –

相關問題