【发布时间】:2015-11-06 19:26:35
【问题描述】:
这里是 Ruby 初学者。我目前正在开发一个用户可以创建公共和私人 wiki 的项目。共有三种不同的角色:管理员、标准用户和高级用户。标准用户只能查看公共 wiki。
授权通过 Pundit 正常工作,我已经成功地列出了我希望每个用户可以访问的 wiki,但我缺少一件事:标准用户可以访问的 Wiki已添加为合作者。
协作者不是角色,因此我很难将这些 wiki 添加到索引中(Wiki 通过协作者有很多用户)。
如果您对我如何实现此功能或替代路线有任何想法,我很乐意听到。
目前,标准用户只能访问公共 wiki 和他或她创建的 wiki(默认情况下是公共的)。目前,标准用户可以查看和编辑他或她已添加到的私人 wiki,但只能通过访问直接 wiki url。
这是我的代码到目前为止的样子:
wiki.rb
class Wiki < ActiveRecord::Base
belongs_to :user
has_many :collaborators
has_many :users, through: :collaborators
scope :visible_to, -> (user) { user && (user.premium? || user.admin?) ? all : where(public: true) }
scope :publicly_visible, -> {where(public: true)}
end
wiki_policy.rb
class WikiPolicy < ApplicationPolicy
def index?
true
end
def show?
record.public? || user.present? && (record.user == user || user.admin? || user.premium? || record.users.include?(user))
end
def create?
user.present?
end
def new?
create?
end
def update?
user.present? && (record.user == user || user.admin? || record.users.include?(user))
end
def destroy?
update?
end
class Scope
attr_reader :user, :scope
def initialize(user, scope)
@user = user
@scope = scope
end
def resolve
if @user.present?
wikis = Wiki.visible_to(@user)
else
wikis = Wiki.publicly_visible
end
end
end
end
wikis_controller.rb
class WikisController < ApplicationController
def index
@wikis = policy_scope(Wiki).paginate(page: params[:page], per_page: 10)
authorize @wikis
end
...
end
【问题讨论】:
标签: ruby-on-rails ruby has-many-through user-roles pundit