2012-06-05 2 views
1

Я использую CanCan для ролевой админ-системы в приложении, которое я создаю. Это своего рода шаблон для веб-магазинов, поэтому администратор может иметь другую роль в каждом интернет-магазине, к которому у него есть доступ. Например: в интернет-магазине 1 он модератор, а в интернет-магазине 2 - редактор.NameError при вызове метода в классе CanCan Класс

Так что мне нужно сделать в способности 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 из класса Ability, потому что я получаю эту ошибку:

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. :) –

Смежные вопросы