Ruby beginner здесь. В настоящее время я работаю над проектом, в котором пользователи могут создавать публичные и частные вики. Существует три разные роли: Admin, Standard User и Premium User. Стандартный пользователь может видеть только публичные вики.Рубиновый пульт Авторизация пользователя и соавторов
авторизации работает должным образом с помощью Пандит, я успешно смог перечислить вики, я хочу каждый пользователь должен иметь доступ, но я пропускаю одно: вики, к которому Стандартный пользователь был добавлен в соавтором.
Коллаборатор не является частью, поэтому мне сложно добавить эти вики к индексу (Wiki имеет много пользователей через соавторов).
Если у вас есть идеи о том, как я могу реализовать это, или, возможно, альтернативный маршрут, я был бы рад услышать их.
В настоящее время стандартный пользователь может получить доступ только к общедоступным вики-сайтам и вики-сайтам, которые он создал (которые являются общедоступными по умолчанию). В настоящее время Пользователь Standard может просмотреть и отредактировать приватную вики, к которой он был добавлен, но только посетив прямой 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