Attualmente sono bloccato su come separare i ruoli per CanCan in base a ciascuna condizione che desideriamo. Nella nostra applicazione, ci sono molte categorie (come matematica, inglese, storia, ecc.) E all'interno di ognuno ci sono molti corsi.Rails: utilizzare CanCan per definire più ruoli in base alle istanze del singolo modello?
Ogni utente può avere molti ruoli diversi in ciascuna categoria. Ad esempio, John può essere un "lettore" per la matematica, il che significa che può leggere tutti i corsi che sono in matematica. John può anche essere uno "scrittore" per l'inglese, il che significa che può leggere tutti i corsi in inglese, creare un corso nella categoria inglese e modificare/eliminare solo i corsi che ha creato in inglese.
Se questi fossero gli unici ruoli che John aveva, non sarebbe in grado di vedere la cronologia delle categorie nella barra di navigazione e gli sarebbe negato l'accesso ai corsi che si trovano nella cronologia.
Questi sono come le relazioni sono istituiti:
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
nel modello/ability.rb abbiamo
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
Domande:
Come si fa a separare i ruoli di "lettore" e "scrittore" nel modo corretto? Come possiamo accedere ai corsi che rientrano nelle categorie a cui abbiamo accesso?
Dopo aver definito i metodi di lettura e scrittura nell'abilità.rb, come li usiamo nelle pagine di visualizzazione? Sembra che le attuali documentazioni usino qualcosa come "<% se possibile?: Read, @category%> " ma questo non usa i metodi che abbiamo separato e definito.
p.s. Avremo 7 diversi ruoli: guest, reader, writer, editor, manager, admin e app_admin (i nostri sviluppatori)
Ho cercato di risolvere questo per 3 giorni ora - per favore, capisco che sono ancora abbastanza un principiante! Grazie in anticipo