Как переопределить rescue_from в контроллере приложения для одного конкретного экземпляра - PullRequest
0 голосов
/ 23 ноября 2018

У меня есть это в моем application_controller.rb:

rescue_from Pundit::NotAuthorizedError, with: :user_not_authorized

def user_not_authorized
  redirect_back fallback_location: root_url,
                 warning: 'Not authorized'
end

, но для одного метода мне нужно

def slug_available
  authorize Page
rescue Pundit::NotAuthorizedError
  render status: :unauthorized
else
  render json: { available: Page.where(slug: params[:slug]).empty? }
end

Однако rescue_from переопределяет явное rescueв slug_available, и я получаю 302 Found вместо 401 Unauthorized.

Я бы подумал, что явное rescue будет иметь приоритет.Как я могу это сделать?

Ответы [ 2 ]

0 голосов
/ 23 ноября 2018

Оказалось, что замена

render status: :unauthorized

на

render plain: 'Not authorized.', status: :unauthorized

устранила проблему.Похоже, что Rails пытался отобразить текущую страницу как HTML со статусом 401, пока я не указал явно что визуализировать.

0 голосов
/ 23 ноября 2018

Вы можете перезаписать метод объявления not_authorized в контроллере и проверить action_name.

protected

def not_authorized
  if action_name == 'slug_available'
    render status: :unauthorized
  else
    super
  end
end

, тогда вам не нужно авторизовывать ваш slug_avaiable метод действия

def slug_available
  render json: { available: Page.where(slug: params[:slug]).empty? }
end

Базовый метод ApplicationController должен быть защищенным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...