Используя гем Devise , как я могу перенаправить на предыдущую страницу после входа в систему, но только если предыдущая страница требует аутентификации (в противном случае перенаправление на определенную страницу c, которую я определяю)?
Требуемый сценарий ios:
- Попытайтесь получить доступ
/my-private-account
> Devise обнаруживает, что требуется аутентификация, и перенаправляет на вход> Успешный вход> перенаправляет на /my-private-account
- Посетите
/
(не требует аутентификации)> посетить /login
> успешно войти в систему> перенаправить на указанную страницу c например. /dashboard
- Посетите
/about
(не требует аутентификации)> посетите /login
> Успешный вход> перенаправьте на /dashboard
Это почти охвачено Devise Wiki , но их ответ перенаправляется обратно для ВСЕХ страниц. Например. с /
(не требует аутентификации)> посетить /login
> Успешный вход> перенаправляет обратно на /
Моя аутентификация определяется в маршрутах:
# routes.rb
authenticate :user do
resources :events
end
# application_controller.rb
class ApplicationController < ActionController::Base
before_action :store_user_location!, if: :storable_location?
private
# Redirect back to current page after sign in
# ref: https://github.com/heartcombo/devise/wiki/How-To:-Redirect-back-to-current-page-after-sign-in,-sign-out,-sign-up,-update
def storable_location?
request.get? && is_navigational_format? && !devise_controller? && !request.xhr?
end
def store_user_location!
# :user is the scope we are authenticating
store_location_for(:user, request.fullpath)
end
def after_sign_in_path_for(resource)
stored_location_for(resource) || dashboard_path
end
end
Есть ли способ проверить, требует ли маршрут аутентификации? Тогда я мог бы переопределить after_sign_in_path_for
, например,
def after_sign_in_path_for(resource)
if stored_location_for(resource).requires_authentication? # something like this...?
stored_location_for(resource)
else
events_path
end
end
Или я решаю эту проблему в неправильном направлении, и есть ли лучший способ?
Наконец, есть ли что-то еще, что мне нужно известно, чтобы эта работа работала и для omniauth?