2014-12-11 3 views
5

Итак, я пытаюсь использовать драгоценный камень. Я просто пытаюсь выяснить, как иметь индексный указатель для пользователей и администраторов. Я хочу сделать все результаты для администратора и только связанных сообщений для пользователя. Я искал googled и искал в github, но мне не повезло. Что мне нужно включить в мою политику и контроллер?Pundit-Index Method для администратора и пользователей

исходный код

class PostsPolicy 
    attr_reader :current_user, :model 

    def initialize(current_user, model) 
    @current_user = current_user 
    @post = model 
    end 

    def index? 
    @current_user.admin? 
    end 
end 

Контроллер

class PostsController < ApplicationController 
    before_filter :load_user 
    before_filter :authenticate_user! 
    after_action :verify_authorized 

    def index 
    @posts = Post.order('title').page(params[:page]).per(25) 
    authorize User 
    end 

private 

    def load_user 
    @user = User.find_by_id(params[:user_id]) 
    end 

end 

второе обновление

class PostsPolicy 
class Scope 
    attr_reader :user, :scope 

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

    def resolve 
    if user.admin? 
     scope.all 
    else 
     scope.where(user: user) 
    end 
    end 

    end 

end 

контроллер

class PostsController < ApplicationController 
    before_filter :load_user 
    before_filter :authenticate_user! 
    after_action :verify_authorized 

def index 
    @posts = policy_scope(Post).order('title').page(params[:page]).per(25) 
    authorize User 
end 

private 

def load_user 
    @user = User.find_by_id(params[:user_id]) 
end 
end 

третье обновление

class PostPolicy 

    class Scope 
    attr_reader :user, :scope 

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

     def resolve 
     if user.admin? 
      scope.all 
     else 
      scope.where(user: user) 
     end 
     end 
    end 

    def index? 
    user.admin? || user.posts.count > 0 
    end 
end 

контроллер

class PostsController < ApplicationController 
    before_filter :load_user 
    before_filter :authenticate_user! 
    after_action :verify_authorized 

def index 
    @posts = policy_scope(Post).order('title').page(params[:page]).per(25) 
    authorize User 
end 

private 

def load_user 
    @user = User.find_by_id(params[:user_id]) 
end 

end 

** окончательное обновление с рабочим кодом **

class PostPolicy 
attr_reader :user, :model 

def initialize(user, model) 
    @user = user 
    @post = model 
end 

    class Scope 
    attr_reader :user, :scope 

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

     def resolve 
     if user.admin? 
      scope.all 
     else 
      scope.where(user: user) 
     end 
     end 
    end 

    def index? 
    user.admin? || user.posts.count 
    end 
end 

контроллер

class PostsController < ApplicationController 
    before_filter :load_user 
    before_filter :authenticate_user! 
    after_action :verify_authorized 

def index 
    @posts = policy_scope(Post).order('title').page(params[:page]).per(25) 
    authorize Post 
end 

private 

def load_user 
    @user = User.find_by_id(params[:user_id]) 
end 

end 

ответ

7

Что вы ищете является Scope:

class PostsPolicy 
    class Scope 
    attr_reader :user, :scope 

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

    def resolve 
     if user.admin? 
     scope.all 
     else 
     scope.where(user: user) 
     end 
    end 
    end 
end 

Затем в контроллере

def index 
    @posts = policy_scope(Post).order('title').page(params[:page]).per(25) 
    authorize User 
end 

Редактировать

В качестве примечания, authorize User, вероятно, не служить вам хорошо в долгосрочной перспективе. Вы по существу создаете политику индекса, которая должна обслуживать каждый индекс. Если вы хотите, чтобы разрешить видимость на индексную страницу вы можете сделать что-то подобное в вашей политике:

def index? 
    user.admin? || user.posts.count > 0 
end 

Если предположить, что зависимость установлена, то вы могли бы назвать authorize Post в контроллере индекса до вашего policy_scope.

+0

Спасибо! У меня есть следующая ошибка для пользователей (а не администратора), пытающихся получить доступ к индексу 'Pundit :: NotAuthorizedError - не разрешено индексировать? этот пользователь: ' pundit (0.3.0) lib/pundit.rb: 74: in''' authorize ' app/controllers/posts_controller.rb: 15: in 'index'' – AGirlThatCodes

+0

Удивительный! Прогресс! Я предполагаю, что этот пользователь либо не администратор, либо/или не имеет каких-либо сообщений? –

+0

Admin- нет, есть сообщения - да. Должен ли я изменить свою область действия, чтобы пользователи могли видеть, что их собственный пост и администраторы видят все?(глупый вопрос, но я думал, что это уже так?) – AGirlThatCodes

 Смежные вопросы

  • Нет связанных вопросов^_^