После успешного входа в систему DEVISE, как перенаправить пользователя на предыдущие действия, требующие входа?
У меня есть кнопка голосования ajax: если пользователь нажимает на изображение "большой палец вверх", но не входит в систему, тогда он должен увидеть диалоговое окно, в котором им будет предложено сначала войти.
Чтобы сделать это диалоговое окно, я использую jQuery и facebox для привязки к событию ajax: failure. Devise поднимет 401 Unauthorized, если пользователь не войдет в систему. Facebox загружает удаленный html для входа во всплывающем диалоговом окне, в котором представлена форма входа DEVISE.
Все работает, кроме как после успешного входа в систему, пользователь перенаправляется на домашнюю страницу. Было бы более интуитивным, если бы пользователь был перенаправлен обратно на почту, на которую они смотрели, чтобы они могли продолжить свой голос.
Существует ли лучший способ достижения такого поведения?
Спасибо.
Ответы
Ответ 1
Я делаю следующее с Authlogic на Rails 3, возможно, вы можете использовать его или сделать что-то подобное:
class ApplicationController < ActionController::Base
after_filter :store_location
private
def store_location
session[:return_to] = request.fullpath
end
def clear_stored_location
session[:return_to] = nil
end
def redirect_back_or_to(alternate)
redirect_to(session[:return_to] || alternate)
clear_stored_location
end
end
Затем вы можете использовать что-то вроде redirect_back_or_to dashboard_path
в действии входа.
Для некоторых контроллеров/действий я не хочу сохранять местоположение (например, страницу входа). Для тех, кто просто пропустил фильтр:
class UserController < ApplicationController
skip_after_filter :store_location
end
В этой статье также есть страница в викторине Devise: https://github.com/plataformatec/devise/wiki/How-To:-Redirect-to-a-specific-page-on-successful-sign-in
Ответ 2
В ApplicationController напишите следующее:
after_filter :store_location
def store_location
session[:previous_urls] ||= []
# store unique urls only
session[:previous_urls].prepend request.fullpath if session[:previous_urls].first != request.fullpath
# For Rails < 3.2
# session[:previous_urls].unshift request.fullpath if session[:previous_urls].first != request.fullpath
session[:previous_urls].pop if session[:previous_urls].count > 2
end
def after_sign_in_path_for(resource)
session[:previous_urls].last || root_path
end
Источник:
https://github.com/plataformatec/devise/wiki/How-To:-Redirect-back-to-current-page-after-sign-in,-sign-out,-sign-up,-update
Ответ 3
используйте cookie. Получите файл window.location.href, к которому они стремятся, и хранят его как файл cookie. На своей домашней странице проверьте наличие этого куки файла в функции готовности документа, переадресуйте его там