Je souhaite que différents types de wikis apparaissent dans l'index, en fonction du rôle de l'utilisateur. La politique pour les utilisateurs admin
et standard
/guest fonctionne comme il se doit, mais quand il s'agit d'utilisateurs haut de gamme et de collaborations, cela devient un peu compliqué. Dans mon application, j'ai la possibilité d'ajouter des collaborateurs au privé Wikis
. Ainsi, un utilisateur Premium devrait pouvoir voir Mes wikis privés, wikis publics et wikis privés, mais les wikis privés où un collaborateur ne se présente pas. Cela pourrait-il concerner ma politique ou mes associations de modèles? S'il vous plaît, aidez-moiStratégie Pundit: les wikis ne s'affichent pas pour les collaborateurs
wiki # Index
def index
@wikis = Kaminari.paginate_array(policy_scope(Wiki)).page(params[:page]).per(10)
end
modèle utilisateur
class User < ActiveRecord::Base
has_many :wikis
has_many :collaborators
belongs_to :collaborators
....
modèle Wiki
class Wiki < ActiveRecord::Base
belongs_to :user
has_many :collaborators
has_many :users, through: :collaborators
....
modèle collaborateur
class Collaborator < ActiveRecord::Base
belongs_to :user
belongs_to :wiki
end
Wiki_policy
class Scope
attr_reader :user, :scope
def initialize(user, scope)
@user = user
@scope = scope
end
def resolve
wikis = []
if user.role == 'admin'
wikis = scope.all # if the user is an admin, show them all the wikis
elsif user.role == 'premium'
all_wikis = scope.all
all_wikis.each do |wiki|
if wiki.private == false || wiki.owner == user || wiki.collaborators.include?(user)
wikis << wiki # if the user is premium, only show them public wikis, or that private wikis they created, or private wikis they are a collaborator on
end
end
else # this is the lowly standard user
all_wikis = scope.all
wikis = []
all_wikis.each do |wiki|
if wiki.private == false || wiki.collaborators.include?(user)
wikis << wiki # only show standard users public wikis and private wikis they are a collaborator on
end
end
end
wikis # return the wikis array we've built up
end
end
quand je vais dans la console
last = Wiki.last
last.collaborators
je reçois ceci:
=> #<ActiveRecord::Associations::CollectionProxy [#<Collaborator id: 7, user_id: 8, wiki_id: 104, created_at: "2016-04-24 08:07:20", updated_at: "2016-04-24 08:07:20">]>
Essayez de tester le code manuellement dans la console. Je suppose que vous n'avez pas affecté le wiki au collaborateur que vous utilisez, car il fonctionne lorsque vous êtes connecté en tant qu'utilisateur standard. Le code ne semble pas devoir échouer – joewoodward
Je l'ai testé sur la console que j'ai utilisée: 'last = Wiki.last, last.collaborators' et j'ai '#]> ' –