2012-05-17 5 views
4

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

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

У меня есть это в мой контроллер сессий:

def after_sign_in_path_for(resource) 
    return request.env['omniauth.origin'] || session[:user_return_to] || root_path 
end 

Я также попытался

... 
return request.env['omniauth.origin'] || stored_location_for(resource) || root_path 
... 

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

Знак входа может быть начат двумя способами. Либо (а) пользователь пытается получить доступ к ограниченному представлению (т. Е. before_filter :authenticate_user!..., и в этом случае они перенаправляются и запрашиваются для входа в систему. Или (б) пользователь щелкает ссылку для знака, которая доступна на каждой странице, если пользователь не зарегистрирован в.

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

Как мне это сделать? Или, где является хорошим источником информации, которая помогла бы мне понять это.

Спасибо!

ответ

9

Вы можете получить предыдущий URL ˙U петь request.referrer, как объясняется в этом СЦ вопрос: How to redirect to previous page in Ruby On Rails?

+0

спасибо. Так вы бы установили это на сеанс под новым в контроллере сессий? –

+1

неважно. Я заменил 'stored_location_for (resource)' на 'request.referrer' в методе' after_sign_in_path_for'. Это отлично работает без необходимости хранить значение в сеансе. –

+0

Спасибо, отлично работает, и действительно полезная ссылка. Я дал ответ на клетку, когда он избил вас минутой и имеет более низкий балл. Но спасибо, отметьте отметку –

4

Использование

redirect_to request.referrer 
+0

Спасибо, работает отлично! –

0

Вот другой подход. Я включаю эту функцию «вернуться к» только по определенным ссылкам (через параметр URL continue). В приведенном ниже примере я проверяю params[:continue] до присвоения его session[:continue] в after_action - , хотя, возможно, это необязательно, если у вас есть авторизация на месте. Наконец, в методе after_sign_in_path_for переопределить метод I deletesession[:continue], используя его (поскольку он не требуется впоследствии) - удаление пары ключ/значение возвращает значение, если ключ совпадает, в противном случае возвращается nil, и в этом случае заявление возвращается на root_path ,

приложение/просмотров/журнал/show.html.erb

<%= link_to 'sign in', new_user_session_path(continue: journal_url(@journal)) %> or 
<%= link_to 'sign up', new_user_registration_path(continue: journal_url(@journal)) %> 

приложение/контроллеры/application_controller.rb

after_action :store_location 

def store_location 
    if params[:continue] =~ /\/(journal\/[0-9]+|foo|bar)\z/ # safelist 
     session[:continue] = params[:continue] 
    end 
end 

def after_sign_in_path_for(resource) 
    session.delete(:continue) || root_path 
end 
1

Heads вверх: Код должен идти в вашем application_controller .rb, а не контроллер сеанса.

Как это работает, так это то, что новые версии Devise автоматически сохраняют начальную страницу, которую пользователь пытался посетить (перед тем как перенаправить ее на вход).

Что можно получить с помощью помощника DEViSE: stored_location_for(resource)

Что вы добавляете в контроллер приложения что-то вроде этого:

def after_sign_in_path_for(resource) 
    stored_location_for(resource) || users_dashboard_path 
    # replace users_dashboard_path by whichever route you want to redirect to after login - default is root_path 
end 

После успешного знака, Разрабатывают будет автоматически запускать ваш метод от контроллера приложения вместо его собственного (переопределяя его).

Для более сложного примера, вот один из команды DEViSE:

def after_sign_in_path_for(resource) 
    stored_location_for(resource) || 
    if resource.is_a?(User) && resource.can_publish? 
     publisher_url 
    else 
     super 
    end 
end 

Я надеюсь, что этот ответ помогает любому поиску, как сделать это с более новыми версиями завещанию.

Смежные вопросы