Как авторизовать действие контроллера с помощью Pundit, если авторизация зависит от переменной экземпляра?

У меня есть класс wedding со многими organizers, а ресурсы вложены друг в друга, поэтому для просмотра организаторов мероприятия мне нужно получить доступ: /events/23/organizers

Контроллер индекса для организаторов выглядит так:

Class OrganizersController < ApplicationController
  def index
    @wedding = Wedding.find(params[:wedding_id]
    @organizers = Organizer.where(wedding: @wedding)
  end
end

Проблема в том, как разрешить pundit авторизовать действие index для OrganizersController и только если для @wedding в экземпляре @wedding.organizers.find(user: current_user).present??

Это две совершенно разные модели, и авторизация одной зависит от другой.


person Amin Shah Gilani    schedule 17.10.2016    source источник


Ответы (3)


Я предполагаю, что Organizer принадлежит Wedding, и в этом случае у вас должно быть @organizers = @wedding.organizers.

Однако, чтобы ответить на ваш вопрос об авторизации экспертов, вы должны посмотреть на scopes. Отсюда вы можете вернуть свадьбы, к которым принадлежит текущий пользователь как организатор.

Вы также должны иметь отношение к текущему пользователю, у которого много свадеб, как к организатору. Итак, у вас будет что-то вроде current_user.weddings, так как у пользователя много свадеб через organizer.

person kobaltz    schedule 17.10.2016
comment
Конечно, но у current_user есть много weddings, и единственный способ выяснить это с помощью wedding, о котором мы говорим, это найти @wedding. Кроме того, области ограничивают только список пользователей. Я хочу запретить пользователям просматривать индекс организаторов свадьбы в /weddings/3/organizers, если пользователь не является одним из организаторов. - person Amin Shah Gilani; 17.10.2016

Ближе всего я пришел к ответу это.

Как я обычно это делаю, добавляю предикат list_organizers? к свадебной политике, а затем:

authorize(@wedding, :list_organizers?)

Хотя это не очень элегантно.

Если вы найдете лучший способ сделать это, пожалуйста, ответьте, и я приму его как лучший.

person Amin Shah Gilani    schedule 08.12.2016

Можете ли вы просто добавить authorize @wedding в действие index контроллера организации? Предполагая, что ваша авторизация уже настроена, чтобы проверить, должен ли пользователь иметь доступ к свадьбе.

person Scott    schedule 27.10.2016