Подтвердить что ты не робот

После успешного входа в систему DEVISE, как перенаправить пользователя на предыдущие действия, требующие входа?

У меня есть кнопка голосования ajax: если пользователь нажимает на изображение "большой палец вверх", но не входит в систему, тогда он должен увидеть диалоговое окно, в котором им будет предложено сначала войти.

Чтобы сделать это диалоговое окно, я использую jQuery и facebox для привязки к событию ajax: failure. Devise поднимет 401 Unauthorized, если пользователь не войдет в систему. Facebox загружает удаленный html для входа во всплывающем диалоговом окне, в котором представлена ​​форма входа DEVISE.

Все работает, кроме как после успешного входа в систему, пользователь перенаправляется на домашнюю страницу. Было бы более интуитивным, если бы пользователь был перенаправлен обратно на почту, на которую они смотрели, чтобы они могли продолжить свой голос.

Существует ли лучший способ достижения такого поведения?

Спасибо.

4b9b3361

Ответ 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. На своей домашней странице проверьте наличие этого куки файла в функции готовности документа, переадресуйте его там