2015-08-13 5 views
0

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 

ответ

0

Спасибо, Майкл!

Первоначально у меня была проблема, когда will_paginate не работал после попытки создания массива вики через область видимости. Вот почему мы пошли другим маршрутом и использовали области visible_to и т. Д. В Wiki-модели.

Однако, пытаясь исправить это, я нашел способ сохранить наш массив так, как это делает контрольная точка, а также разбивать их на страницы.

Моя политика теперь выглядит следующим образом:

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 

вики.гь

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

я смог постраничной и показать правильный список вики (включая совм вики) путем добавления следующего файла в конфиге/Инициализаторы

array_paginate.rb

требуют " will_paginate/array '

0

Здравствуйте, коллега по блоку!

Try Добавляя это в рамках политики:

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 

Кроме того, я заметил, что вы премиум пользователи могут видеть всех частных вики, а не только свои собственные.

Счастливое кодирование!