Как заставить Devise перенаправить на сохраненное местоположение после входа или регистрации? - PullRequest
5 голосов
/ 10 марта 2011

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

Например, если у меня есть "comments «Контроллер, который защищен:

before_filter :authenticate_user!

Тогда я хочу, чтобы пользователи нажимали« Комментировать сейчас! »кнопка (и, следовательно, перенаправляются на новое действие в CommentsController), чтобы войти в систему, а затем Devise перенаправить их на новое действие (или где бы они ни были) в CommentsController, а не на общий корень приложения или на общий after_sign_in_path.

Просматривая RDOC для Devise, я обнаружил этот метод , который выглядит так, как будто у Devise есть хотя бы способность самостоятельно делать что-то подобное,но я не могу найти способ.

Ответы [ 5 ]

9 голосов
/ 10 марта 2011

ОК, поэтому я провел еще несколько экспериментов и, работая с информацией Корми, получил рабочее решение.

Из того, что я могу определить, before_filter authenticate_user! делает не сохранить маршрут для возвращения пользователя.Я сделал следующее:

Сначала я добавил дополнительный before_filter вверху моего контроллера

before_filter :store_location
before_filter :authenticate_user!

Затем я написал метод store_location внизуконтроллер

private

  def store_location
    session[:user_return_to] = any_old_route_path
  end

Я не утверждаю, что это идеально, но это работает для меня.(Недостатком для всех, кто хочет его использовать, является то, что он поддерживает только один путь возврата на контроллер. Это все, что мне нужно для себя, но это лишь небольшое улучшение по сравнению с одним путем возврата на приложение, которое я использовал ранее.) Я был бы очень признателен за чьи-либо идеи и предложения.

1 голос
/ 01 мая 2014

Простой способ сделать это:

# Modified from https://github.com/plataformatec/devise/wiki/How-To:-redirect-to-a-specific-page-on-successful-sign-in
class ApplicationController < ActionController::Base
  def after_sign_in_path_for(resource)
    stored_location_for(resource) || your_defaut_path 
  end
end
1 голос
/ 15 апреля 2011

Разработчик должен сделать это сам. Аутентификатор_пользователя! Фильтр также не хотел работать для меня, когда маршрут к действию был задан методом PUT. Когда я изменил это на GET в rout.rb, devise начал работать как положено.

0 голосов
/ 10 марта 2011

Вы пробовали after_sign_in_path_for ? Если вы определяете этот метод в ApplicationController, он должен переопределить реализацию по умолчанию для каждого контроллера.

0 голосов
/ 10 марта 2011

Я думаю, что по умолчанию Devise сохраняет маршрут, но вы можете использовать

sign_in @user

это должно перенаправить вас

sign_in_and_redirect(@user) #assuming you are sigining in that resource
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...