Ruby Pundit 授权用户和合作者
Ruby Pundit Authorization Users and Collaborators
Ruby初学者过来。我目前正在从事一个项目,用户可以在其中创建 public 和私人维基。共有三种不同的角色:管理员、标准用户和高级用户。标准用户只能查看 public 个维基。
授权通过 Pundit 正常工作,我已经成功列出了我希望每个用户都可以访问的维基,但我遗漏了一件事:维基已将标准用户添加为协作者。
协作者不是角色,所以我很难将这些 wiki 添加到索引中(Wiki 通过协作者有很多用户)。
如果您对我如何实现这个有任何想法,或者可能有替代路线,我很乐意听取他们的意见。
目前,标准用户只能访问 public 个 wiki 和他或她创建的 wiki(默认为 public)。目前,标准用户 可以 查看和编辑他或她已添加到的私人 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
bloc同学你好!
尝试将此添加到您的策略范围:
def resolve
if @user.present?
wikis = Wiki.visible_to(@user)
Wiki.all.each do |wiki|
if wiki.users.include?(@user)
wikis << wiki
end
end
wikis
else
wikis = Wiki.publicly_visible
end
end
此外,我注意到您的高级用户可以查看所有私人 Wiki,而不仅仅是他们自己的。
编码愉快!
谢谢迈克尔!
最初,我遇到了一个问题,在尝试通过范围构建维基数组后,will_paginate 无法正常工作。这就是为什么我们走不同的路线并在 Wiki 模型中使用 visible_to 等范围。
然而,在尝试解决此问题时,我找到了一种方法来使我们的数组保持检查点预期的方式并对其进行分页。
我的政策现在是这样的:
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
wikis = []
if user.present?
if user.admin?
wikis = scope.all
elsif user.premium?
all_wikis = scope.all
all_wikis.each do |wiki|
if wiki.public? || wiki.user == user || wiki.users.include?(user)
wikis << wiki
end
end
else
all_wikis = scope.all
wikis = []
all_wikis.each do |wiki|
if wiki.public? || wiki.users.include?(user)
wikis << wiki
end
end
end
end
wikis
end
end
end
wiki.rb
class Wiki < ActiveRecord::Base
belongs_to :user
has_many :collaborators
has_many :users, through: :collaborators
end
通过在 config/initializers
中添加以下文件,我能够分页并显示正确的维基列表(包括协作维基)
array_paginate.rb
需要'will_paginate/array'
Ruby初学者过来。我目前正在从事一个项目,用户可以在其中创建 public 和私人维基。共有三种不同的角色:管理员、标准用户和高级用户。标准用户只能查看 public 个维基。
授权通过 Pundit 正常工作,我已经成功列出了我希望每个用户都可以访问的维基,但我遗漏了一件事:维基已将标准用户添加为协作者。
协作者不是角色,所以我很难将这些 wiki 添加到索引中(Wiki 通过协作者有很多用户)。
如果您对我如何实现这个有任何想法,或者可能有替代路线,我很乐意听取他们的意见。
目前,标准用户只能访问 public 个 wiki 和他或她创建的 wiki(默认为 public)。目前,标准用户 可以 查看和编辑他或她已添加到的私人 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
bloc同学你好!
尝试将此添加到您的策略范围:
def resolve
if @user.present?
wikis = Wiki.visible_to(@user)
Wiki.all.each do |wiki|
if wiki.users.include?(@user)
wikis << wiki
end
end
wikis
else
wikis = Wiki.publicly_visible
end
end
此外,我注意到您的高级用户可以查看所有私人 Wiki,而不仅仅是他们自己的。
编码愉快!
谢谢迈克尔!
最初,我遇到了一个问题,在尝试通过范围构建维基数组后,will_paginate 无法正常工作。这就是为什么我们走不同的路线并在 Wiki 模型中使用 visible_to 等范围。
然而,在尝试解决此问题时,我找到了一种方法来使我们的数组保持检查点预期的方式并对其进行分页。
我的政策现在是这样的:
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
wikis = []
if user.present?
if user.admin?
wikis = scope.all
elsif user.premium?
all_wikis = scope.all
all_wikis.each do |wiki|
if wiki.public? || wiki.user == user || wiki.users.include?(user)
wikis << wiki
end
end
else
all_wikis = scope.all
wikis = []
all_wikis.each do |wiki|
if wiki.public? || wiki.users.include?(user)
wikis << wiki
end
end
end
end
wikis
end
end
end
wiki.rb
class Wiki < ActiveRecord::Base
belongs_to :user
has_many :collaborators
has_many :users, through: :collaborators
end
通过在 config/initializers
中添加以下文件,我能够分页并显示正确的维基列表(包括协作维基)array_paginate.rb
需要'will_paginate/array'