2010-09-03 11 views

Odpowiedz

4

Myślę, że metoda opracować after_sign_in_path_for jest to, czego szukasz.

Zdefiniuj tę metodę w aplikacji ApplicationController i spowoduje przekroczenie domyślnej implementacji Devise. To właśnie określa dokumentacja.

Szczegóły tutaj: http://rdoc.info/github/plataformatec/devise/master/Devise/Controllers/Helpers:after_sign_in_path_for

+0

Zapomniałem wspomnieć w Devise 1.0, a nie 1.1. – Pablo

+0

after_sign_in_path_for w ogóle nie jest wywoływana w wersji 1.0.8. – Pablo

+0

Patrząc na SessionsController Devise, po pomyślnym zalogowaniu następuje wywołanie sign_in_and_redirect. To przekierowanie do poprzedniej lokalizacji zapisanej w sesji. Jeśli nie zapisano żadnej lokalizacji, wywoływana jest funkcja after_sign_in_path_for. Czy użytkownik loguje się na (lub za pośrednictwem) strony głównej? To może wyjaśnić, dlaczego zawsze tam się przekierowuje. – Sidane

21

Są szanse, że użytkownik jest przekierowywany przed after_sign_in_path nazywa. Dzieje się tak, gdy użytkownik próbuje przejść bezpośrednio do strony chronionej przez uwierzytelnianie. Dzieje się tak przez cały czas, jeśli masz chronione root_path ("/") przez uwierzytelnianie.

Jest tam dyskusja na grupach google na ten temat:

Szybki i brudny rozwiązaniem jest zastąpienie stored_location_for zawsze powrócić nil tak:

class ApplicationController < ActionController::Base 
... 

    private 
    def stored_location_for(resource_or_scope) 
    nil 
    end 

    def after_sign_in_path_for(resource_or_scope) 
    my_favorite_path 
    end 
end 
+1

Jako niewielką odmianę tego, zwracam tylko zero z adresu stored_location_for, jeśli pasuje do "/", która jest moją domyślną trasą. W ten sposób przejdą one do after_sign_in_path tylko wtedy, gdy nie będą wyraźnie próbowali przejść gdzie indziej. Aby to zrobić, zamień zerem na "(location = super) == '/"? Nil: location ". –

0

Przypuśćmy, że po zalogowaniu się chcesz wyświetlić pulpit użytkownika.

class HomesController < ApplicationController  
    def index 
     if current_user //returns nil if not logged in 
      @users = User.all 
      render :dashboard 
     end 
    end 

    def dashboard 
     @users = User.all 
    end 
end 

w routes.rb:

root :to => 'homes#index' 

Jeśli zalogowany, jeśli blok jest wprowadzony w działanie indeksu i dashboard.erb staje się. (pamiętaj, aby zainicjować wszystkie zmienne wymagane przez dashboard.erb, w bloku if) W przeciwnym razie szyny renderują index.erb

Powiązane problemy