В рельсах определение подкласса области видимости Pundit для отображения различных наборов сообщений в зависимости от типа пользователя.

Здравствуйте, я новичок в ruby ​​on rails и в настоящее время работаю над упражнением, в котором у меня есть 3 типа пользователей (администратор, модератор и участник). Я использую драгоценный камень Pundit с драгоценным камнем Devise. Меня попросили определить классы областей Pundit, чтобы сделать сообщения доступными в соответствии с ролью пользователя.

Админ и модератор могут видеть все сообщения. Авторизованный пользователь может видеть только свои сообщения. Гость не может видеть сообщения.

Вот PostsController:

class PostsController < ApplicationController
          def index
            @posts = policy_scope(Post.all)
            authorize @posts
          end

          def show
            @post = Post.find(params[:id])
          end

          def new
            @post = Post.new
            authorize @post
          end

          def create 
            @post = current_user.posts.build(params.require(:post).permit(:title, :body))
            authorize @post
            if @post.save
              flash[:notice] = "Post was saved"
              redirect_to @post
            else
              flash[:error] = "There was an error saving the post. Please try again"
              render :new
            end
          end

          def edit
            @post = Post.find(params[:id])
            authorize @post
          end
          def update 
            @post = Post.find(params[:id])
            authorize @post
            if @post.update_attributes(params.require(:post).permit(:title, :body))
              flash[:notice] = "Post was updated."
              redirect_to @post
            else
              flash[:error] = "There was an error saving the post.Please try again."
              render :edit
            end
          end
        end

Here's my application policy:

    class ApplicationPolicy
      attr_reader :user, :record

      def initialize(user, record)
        @user = user
        @record = record
      end

      def index?
        false
      end

      def show?
        scope.where(:id => record.id).exists?
      end

      def create?
        user.present?
      end

      def new?
        create?
      end

      def update?
        user.present? && (record.user == user || user.admin?)
      end

      def edit?
        update?
      end

      def destroy?
        update?
      end

      def scope
        record.class
      end

      class Scope
        attr_reader :user, :scope

        def initialize(user, scope)
          @user = user
          @scope = scope
        end

        def resolve
          scope
        end
      end
    end

И моя почтовая политика:

class PostPolicy < ApplicationPolicy 


  class Scope < Scope 
    def resolve 
      if user.admin? || user.moderator? 
      scope.all

      else
      scope.where(:id => user.id).exists?
      end
    end
  end 


  def index?
    user.admin? || user.id?
  end

end

Кроме того, есть ли где-нибудь, где я могу прочитать или узнать больше о политиках области действия с Pundit и авторизации на рельсах?


person Zein    schedule 27.02.2015    source источник
comment
Вы так и не сказали, в чем проблема? Вы можете понять, как делать упражнение, или вы застряли на нем? Подробнее о Pundit можно прочитать здесь   -  person Karim Tarek    schedule 28.02.2015


Ответы (2)


Всегда записывайте методы для объявления администратора и модератора в вашей модели пользователя, если вы хотите работать с политиками Pundit.

def admin?
  role == 'admin'
end

def moderator?
  role == 'moderator'
end
person bntzio    schedule 18.03.2015

Есть лучший способ определить администраторов, модераторов и участников. Сначала сделайте:

rails g migration AddRoleToUsers role:integer

Затем в вашей модели пользователей сделайте перечисление

enum role: [:member, :moderator, :admin] # add whatever roles you want 

Перечисление автоматически создаст для каждой роли

.member? # checks if role is member
.member! # turns the user into a member so like current_user.member!
 # and the same for all other roles.

Не уверен, что это действительно помогает, но надеюсь, что вы найдете это полезным!

person toyhammered    schedule 27.12.2015