Rails: CanCanCan - ошибка AccessDenied не отображается - PullRequest
0 голосов
/ 31 мая 2018

Я использую CanCanCan в моем приложении rails для авторизации.Маршруты и перенаправления работают нормально, но мне не удается отобразить сообщение об ошибке AccessDenied (раньше это работало, но я, должно быть, что-то напутал на пути, а теперь просто не будет отображаться).

Вот мойкод:

controllers / application_controller.rb

class ApplicationController < ActionController::Base
  protect_from_forgery with: :exception

  rescue_from CanCan::AccessDenied do |exception|
    redirect_to root_url, error: exception.message
  end
  ...
end

(я изменил значение по умолчанию :alert на :error, так как в противном случае я получал предупреждение отdevise ('Вы уже вошли в систему').

views / index.html.haml (root)

= flash[:error] if flash[:error]
...

Любые идеи о том, как его получитьработать снова? Заранее спасибо.

--- РЕДАКТИРОВАТЬ ---

Еще несколько исправлений, которые я пробовал (безуспешно):

  • Замена error на message и notice

  • Полное удаление метода rescue_from CanCan::AccessDenied - это привело меня к стандартной странице ошибок CanCan (так что я знаюсам метод работает).

  • Замена exception.message обычной строкой.

  • Добавление оператора put перед перенаправлениемn - он печатается в консоли, как и следовало ожидать.

  • Как подсказывает @Anand Shah в ответе на этот вопрос , я добавил следующее, на мой взгляд:

- если flash [: error] .blank?
% p флэш-хэш пуст

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

flash.keep (: ошибка)

в моем контроллере, но это ничего не изменило.

Ответы [ 3 ]

0 голосов
/ 31 мая 2018

Вы пытались не обрабатывать это встроенное, а скорее что-то вроде:

 rescue_from CanCan::AccessDenied do |exception|
    flash[:error] =  exception.message
    redirect_to root_url
 end

Причина, по которой он работал раньше, заключается в том, что Rails понимает :alert и :notice как флэш-сообщения во время redirect_to, иначе выследует использовать «общее назначение flash ведро», так как оно вызывается через flash: {error: 'your message'}

Однако Hash, переданный redirect_to, также может содержать код состояния http (:status) и URL-запроспараметры (все, что не является :alert, :notice, :status или :flash и все это кажется слишком большим шумом (IMO), чтобы поместить туда флэш-сообщение, чтобы сохранить 1 строку явного кода.

0 голосов
/ 04 июня 2018

Причиной этой проблемы оказалась моя routes.rb.В дополнение к определению корня для области разработки:

devise_scope :user do
  root to: "devise/sessions#new"
end

authenticated :user do
  root 'application#show', as: :authenticated_root
end

У меня также был определен дополнительный корень (который в основном вызывал двойное перенаправление и, следовательно, потерю предупреждения):

root to: 'application#show'

код из документации работает просто отлично после необходимой модификации (обратите внимание, я мог бы вернуть его с error до alert, не ломая вещи):

rescue_from CanCan::AccessDenied do |exception|
  redirect_to root_url, alert: exception.message
end
0 голосов
/ 31 мая 2018

Вы пробовали это через частный браузер на случай, если файлы cookie испортились?

Можете ли вы попробовать этот формат?

redirect_to(root_url, {:flash => { :error => exception.message }})
...