Я борюсь с авторизацией действия индекса вложенного ресурса при использовании Pundit. Пандит настолько скользкий и потенциально легкий, что я ненавижу отбрасывать его, потому что я не могу понять это. Я понимаю, как только я пойму эту часть, все остальное упадет в линию. Я читал много сообщений о людях, задавая очень похожие вопросы тем, которые я задаю, и кажется, что сообщения, которые ближе всего подходят к вопросу, который я прошу, никогда не решаются. Итак, я все еще ищу ответ.Как ограничить авторизацию действием индекса ресурса пользователя с помощью Pundit? Я не думаю, что ответ является областью
class User < ApplicationRecord
enum role: [:user, :admin]
after_initialization :set_default_role, :if => :new_record?
def set_default_role
self.role ||= :user
has_many :galleries, dependent: :destroy
end
class Gallery < ApplicationRecord
belongs_to :user
validates :user_id, presence: true
validates :title,, presence: true
end
У меня есть пользовательский настрой, как я хочу его с помощью UserPolicy. Он не наследуется от ApplicationPolicy, потому что учебник, на который я смотрел, сказал, что мне это не нужно.
моих маршрутов выглядеть следующим образом:
devise_for :users, path: 'accounts
resources :users, shallow: true do
resources :galleries
end
По существу я не хочу один пользователь, чтобы увидеть другие пользователь вещи, т.е. индекс, шоу ... действия. Я считаю, что это называется закрытой системой. Мой маршрут для просмотра галереи пользователя (мой вложенный ресурс) Индекс выглядит следующим образом:
localhost:/users/20/galleries
Я не хочу пользователя 19, чтобы когда-либо видеть, что пользователь 20 имеет в своей галерее индекс. Как мне это сделать?
Это то, что мой GalleryController выглядит следующим образом:
before_action :authenticate_user! #I'm using devise
def index
@galleries = current_user.galleries.all
#authorize ????? <<part of what I don't understand
end
private
def gallery_params
params.require(:gallery).permit(:title)
end
Действительно, я не знаю, что я должен делать в GalleryPolicy для индекса. Я разработал действие show, потому что он просто проверяет экземпляр галереи на экземпляр идентификатора пользователя. Здесь представлено GalleryPolicy
attr_reader :user, :model
def initialize(user, model)
@user = user
@gallery = gallery
end
def show?
@gallery.user_id == user.id
end
def index?
# I can't figure it out
end
def new?
#actually this is confusing too
end
Я ценю ваш комментарий. Я реализовал все, как вы сказали, но это не изменило ситуацию. 1st: UserA все еще может видеть индекс галереи UserB. 2nd: Каждый индекс галереи пользователя имеет все галереи других пользователей. Я хочу перенаправить UserA на другую страницу со флэш-сообщением, в котором говорится «Доступ запрещен», если они попытаются перейти на страницу индекса галереи галереи UserB. И я не хочу, чтобы галереи других пользователей отображались в другом индексе галереи пользователя. – Lenocam
На самом деле, я думаю, ты прав. Проблема, с которой я сейчас сталкиваюсь, связана, но не та, которую я попросил помочь. Это работает. Благодаря! – Lenocam
рад, что я мог бы помочь! Если вы разместите еще один вопрос с вашей новой проблемой, пришлите мне ссылку здесь, и я посмотрю на нее, чтобы посмотреть, смогу ли я помочь :) – cdimitroulas