2010-12-02 4 views
9

У меня проблема с noob. Я хотел получить программу для перенаправления на последнюю страницу, которую посетил пользователь. Так что я сделал следующее ...Переадресация с помощью Devise after_sign_in_path_for

def after_sign_in_path_for(resource) 
    request.referer 
end 

Работает отлично ... кроме того, если пользователь на самом деле вход через исходную форму, которая вызывает цикл перенаправления.

Я попытался

def after_sign_in_path_for(resource) 
    if (request.referer == "https://stackoverflow.com/users/sign_in") 
    :pages_home 
else 
    request.referer 
end 

end 

Но это еще не работает, скорее всего, потому что я понятия не имею, что request.referer на самом деле возвращения, когда он встречает на страницу входа исходного пользователя (www.example.com/users/sign_in).

Любые идеи?

tldr; Используя завещать, я хочу, чтобы перенаправить на страницу вход с (т.е./блог/4), если страница не является/пользователей/sign_in

РЕШИТЬ:

Matchu был прав. Request.referer не возвращал домен, а также ...

http://example.com/users/sign_in 

(примечание: нет WWW префикс)

Я все еще заинтересован в качестве альтернативы request.referer, если его небезопасным или неэффективным способом ,

+0

реферер, вероятно, содержит имя домена:/ – Matchu 2010-12-02 00:35:17

+0

Это работает очень хорошо для меня: http://stackoverflow.com/questions/5255283/how-do-i-make- devise-redirect-to-a-stored-location-after-sign-in-or-sign- – 2012-08-20 22:29:55

ответ

12

Не перенаправляйте ссылки - это, как правило, плохая идея.

Вместо этого передайте значение next в строке запроса или данных формы. Возможно, использовать что-то вроде:

def after_sign_in_path_for(resource) 
    params[:next] || super 
end 

Когда пользователь пытается посетить страницу аутентификации требует (например, /admin/posts/3/edit) о проверке подлинности before_filter выдает redirect_to new_session_url(:next => request.path). Затем закодируйте действие входа и просмотр, чтобы сохранить параметр строки запроса :next.

+0

Не знаете, что вы имеете в виду. Как скрытый ввод: следующий содержит текущий url? – Elxx 2010-12-02 02:12:00

2

Как об этом:

def after_sign_in_path_for(resource) 
    sign_in_url = url_for(:action => 'sign_in', :controller => 'users', :only_path => false, :protocol => 'http') 
    if (request.referer == sign_in_url) 
    super 
    else 
    request.referer 
    end 
end 
2

Я принял ответ юстиции и изменил его использовать сессии вместо этого.

Насколько я могу судить, сеансы проще, чем добавление url в качестве параметра, но они могут показаться неожиданными, например, когда пользователь просматривает сайт на нескольких вкладках. Использование сеансов меньше RESTfull, но проще и чище.

При использовании канкан, установив редирект-путь может быть сделано в одном месте: место, которое обрабатывает «доступ запрещен» исключения:

rescue_from CanCan::AccessDenied do |exception| 
    if current_user.nil? 
     session[:next] = request.fullpath 
     puts session[:next] 
     redirect_to new_user_session_path, :alert => exception.message 
    else 
     render :file => "#{Rails.root}/public/403.html", :status => 403 
    end 
    end 

Но вы можете установить это в любом месте, на самом деле:

def edit 
    if current_user.roles[:moderator].nil? 
    session[:next] = "/contact" 
    redirect_to new_user_session_path, :alert => "please contact the moderator for access" 
    end 
    # ... 
end 

Затем, в ApplicationController, вы можете повторно использовать это значение сеанса. Не забудьте также удалить его.

def after_sign_in_path_for(resource) 
    path = '' 
    if session[:next] 
     path = session[:next] 
     session[:next] = nil 
    else 
     path = super 
    end 

    path 
    end 
0

Вот мой код для rescue_from CanCan.

rescue_from CanCan::AccessDenied do |exception| 
    if current_user.nil? 
    session[:next] = request.fullpath 
    puts session[:next] 
    redirect_to login_url, :alert => "You have to be logged in to continue" 
    else 
    #render :file => "#{Rails.root}/public/403.html", :status => 403 
    if request.env["HTTP_REFERER"].present? 
     redirect_to :back, :alert => exception.message 
    else 
     redirect_to root_url, :alert => exception.message 
    end 
    end 
end 

Что он делает: - если пользователь не вошел в систему, он перенаправляет на страницу входа - если пользователь вошел в систему, но не имеют возможности видеть действие, он перенаправляет либо назад или на корневой странице с флэш-оповещения сообщение

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