Obecnie utknąłem na temat oddzielania ról dla CanCan w zależności od każdego warunku, który chcemy. W naszej aplikacji znajduje się wiele kategorii (takich jak matematyka, język angielski, historia itp.), A w ramach każdego z nich jest wiele kursów.Szyny: Używanie CanCan do definiowania wielu ról w zależności od instancji pojedynczego modelu?
Każdy użytkownik może mieć wiele różnych ról w każdej kategorii. Na przykład John może być "czytelnikiem" matematyki, co oznacza, że potrafi czytać wszystkie kursy matematyki. John może również być "pisarzem" dla języka angielskiego, co oznacza, że może czytać wszystkie kursy w języku angielskim, utworzyć kurs w kategorii angielski i edytować/usuwać tylko kursy, które stworzył w języku angielskim.
Gdyby to były jedyne role, jakie miał John, nie byłby w stanie zobaczyć historii kategorii w pasku nawigacyjnym i nie otrzymałby dostępu do kursów w historii.
Są jak relacje są skonfigurowane:
class User < ActiveRecord::Base
has_many :roles
def has_role?(role_sym)
roles.any? { |r| r.level.underscore.to_sym == role_sym }
end
end
class Category < ActiveRecord::Base
has_many :roles
has_many :courses
end
class Role < ActiveRecord::Base
belongs_to :user
belongs_to :category
attr_accessible :level, :category_id, :user_id
end
w modelu/ability.rb mamy
class Ability
include CanCan::Ability
def initialize(user)
user ||= User.new # guest user (not logged in) #guest
if user.has_role? :reader
reader(user)
end
if user.has_role? :writer
writer(user)
end
end
#BE ABLE TO SEE COURSES AND CATS FOR PERMITTED CATS.
def reader(user)
can :read, Category, :roles => { :user_id => user.id, :level => "reader" }
## how would we be able to limit reading of courses that are within permitted categories? something like category.courses ~~
end
def writer(user)
reader(user) #inheriting from reader? this doesnt work because level is hardcoded into reader
can :read, Category, :roles => { :user_id => user.id, :level => "writer"}
# 1.you can read all courses in category that you are given permission to
# 2.you can write courses in permitted category
# 3.you can edit, delete courses that only youve created within permitted category
end
end
pytania:
Jak rozdzielić role "czytnik" i "pisarz" we właściwy sposób? W jaki sposób uzyskujemy dostęp do kursów należących do kategorii, do których mamy dostęp?
Po zdefiniowaniu metod czytnika i pisarza w pliku ability.rb, w jaki sposób wykorzystujemy je na naszych stronach widoków? Wygląda na to, że obecne dokumenty używają czegoś takiego jak "<%, jeśli można?: Odczytać, @ kategoria%> ", ale to nie wykorzystuje metod, które rozdzieliliśmy i zdefiniowaliśmy.
p.s. Będziemy mieli 7 różnych ról: gość, czytelnik, pisarz, redaktor, menedżer, administrator i app_admin (nasi programiści)
Próbowałem rozwiązać ten problem przez 3 dni - proszę, zrozum, że wciąż jestem sprawiedliwy Początkujący! Z góry dziękuję