权威政策:维基不会出现在合作者身上

时间:2016-04-24 08:25:15

标签: ruby-on-rails policy pundit bloc.io

我希望根据用户的角色在索引视图中显示不同类型的wiki。 adminstandard /来宾用户的政策应该正常工作,但是当涉及高级用户和协作时,它会变得有点混乱。在我的应用中,我可以将协作者添加到私人Wikis。所以一个高级用户我应该能够看到我的私人维基,公共维基和私人维基,我合作,但私人维基,我是一个合作者不出现给我。它可能与我的政策或我的模型协会有关吗?请帮帮我

wiki #index

  def index
    @wikis = Kaminari.paginate_array(policy_scope(Wiki)).page(params[:page]).per(10)
  end

用户模型

class User < ActiveRecord::Base
  has_many :wikis
  has_many :collaborators
  belongs_to :collaborators
....

维基模式

    class Wiki < ActiveRecord::Base
      belongs_to :user
      has_many :collaborators
      has_many :users, through: :collaborators
....

协作者模型

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

当我进入控制台时

last = Wiki.last 
last.collaborators 

我明白了:

   => #<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">]>

1 个答案:

答案 0 :(得分:1)

啊,我看到了这个问题。您的连接表格格式不正确,这可能是因为您同时使用belongs_to和has_many,因此您对命名感到困惑。 ie belongs_to:user和has_many:users

您需要利用直通定义中的class_name

Wiki
  # the owner
  belongs_to :user

  # the collaborators join table
  has_many :wiki_collaborators

  # this is the object you will call from wiki.collaborators
  has_many :collaborators, through: :wiki_collaborators, class_name: 'User'
end

User
  # the wikis owned by this user
  has_many :wikis

  # the join table
  has_many :wiki_collaborators

  # this is the object you can call from user.wiki_collaborations or something else that maybe fits better
  has_many :wiki_collaborations, through: :wiki_collaborators, class_name: 'Wiki'
end

WikiCollaborator
  belongs_to :user
  belongs_to :wiki
end

问题在于,当您调用wiki.collaborator时,实际上是返回连接模型而不是用户模型。

你实际上可以调用wiki.users(注意复数)来获取你目前拥有的代码中的wiki合作者。 您仍然需要修复用户belongs_to:协作者行。 我认为放弃Collaborator连接表并将其重新生成为WikiCollaborator会更有意义然后实现就像我所描述的那样

希望这有帮助