Итак, я пытаюсь использовать драгоценный камень. Я просто пытаюсь выяснить, как иметь индексный указатель для пользователей и администраторов. Я хочу сделать все результаты для администратора и только связанных сообщений для пользователя. Я искал 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
Спасибо! У меня есть следующая ошибка для пользователей (а не администратора), пытающихся получить доступ к индексу 'Pundit :: NotAuthorizedError - не разрешено индексировать? этот пользователь: ' pundit (0.3.0) lib/pundit.rb: 74: in''' authorize ' app/controllers/posts_controller.rb: 15: in 'index'' – AGirlThatCodes
Удивительный! Прогресс! Я предполагаю, что этот пользователь либо не администратор, либо/или не имеет каких-либо сообщений? –
Admin- нет, есть сообщения - да. Должен ли я изменить свою область действия, чтобы пользователи могли видеть, что их собственный пост и администраторы видят все?(глупый вопрос, но я думал, что это уже так?) – AGirlThatCodes