2011-10-26 9 views
10

Zastanawiałem się, w jaki sposób można zdefiniować klasę zdolności i służyć tej klasy zdolności w zależności od użytkownika, który jest zalogowany.szyny CAN CAN Możliwość Klasy Dla wielu opracować modele

używam aktywny Administrator, Can Can i opracować i pomyślnie utworzyłem modele User i AdminUser.

mam to w moim ability.rb

class Ability 
    include CanCan::Ability 

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

    if (user) 
     can :manage, Item 
    end 
    end 
end 

Teraz użyłem tego wpisu wiki ustalić, że rzeczywiście możemy zdefiniować niestandardowy plik zdolności i używać zamiast ability.rb:

https://github.com/ryanb/cancan/wiki/changing-defaults

Ale to, co chciałem zrobić to, by móc korzystać z ability.rb czy „użytkownik non-admin” jest podpisany i zwyczaj abilty jeśli administrator użytkownik jest zalogowany.

Pytanie boczne: Czy można to zrobić tak, że nie potrzebuję niestandardowego i mogę ustawić uprawnienia w jednym pliku ability.rb?

+0

Ach, masz rację. Nie zauważyłem, że użyłeś osobnej klasy dla użytkowników i administratorów. Powinieneś być w stanie zmienić klasę używaną przez Active Admin, ale nie będąc użytkownikiem tego systemu, nie jestem pewien dokładnie, gdzie to jest. Prawdopodobnie powinien jednak sprawdzić twoje inicjatory. – jdl

Odpowiedz

12

Nigdy tak naprawdę nie używałem ActiveAdmin, więc nie jestem do końca pewien, czy czegoś brakuje, ale nie wygląda na to, że framework opiera się na CanCan. Dlatego zakładam, że definiujesz metodę, jak wyjaśniono na wiki i jest ona tworzona przy pomocy Ability.new(current_user).

Jeśli to przypadek, a Twoje current_user może być albo User lub AdminUser, wtedy nie ma problemu w sprawdzanie, że w klasie Ability:

class Ability 
    include CanCan::Ability 

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

    if user.kind_of? AdminUser 
     can :manage, Item 
    elsif user.kind_of? User 
     can :read, Item 
    end 
    end 
end 

Można po prostu przyjrzeć się użytkownikowi na wpisz i zmień odpowiednio zasady. Możesz także użyć is_a? zamiast kind_of? w celu dokładniejszego sprawdzenia, ale prawdopodobnie nie jest to wymagane i może powodować problemy, jeśli zdecydujesz się na dziedziczenie później.

Innym sposobem sprawdzenia jest określenie metody admin? w obu modelach. Może to być lepszy sposób, ponieważ dokładne sprawdzanie typu nie jest zbyt popularne w ruby ​​- często ogranicza twoje wybory. Może wyglądać tak:

class User < ActiveRecord::Base 
    def admin? 
    false 
    end 
end 

class AdminUser < ActiveRecord::Base 
    def admin? 
    true 
    end 
end 

class Ability 
    include CanCan::Ability 

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

    if user.admin? 
     can :manage, Item 
    else 
     can :read, Item 
    end 
    end 
end 
Powiązane problemy