2012-01-17 10 views
8

Używam Rails 3 i Devise do tworzenia aplikacji, w której użytkownicy docierają do witryny i wyświetlają stronę główną zawierającą login i formularz rejestracji. Ta strona ma swój własny sterownik („Strona główna”), więc jest to trasa jestRails 3 w/Devise: Jak ustawić dwie oddzielne strony główne na podstawie tego, czy użytkownik jest uwierzytelniony, czy nie?

root :to => "homepage#index" 

chcę wyświetlić inną stronę, jeśli użytkownik jest już zalogowany. To konto aby mając punkt korzeniowy do

root :to => "dashboard#index" 

Czy istnieje sposób zapisania warunkowej trasy w routes.rb, która pozwoliłaby mi sprawdzić, czy użytkownik jest uwierzytelniony przed przekierowaniem ich na jedną z tych stron głównych?

Próbowałem użyć następującego kodu, ale jeśli nie jestem zalogowany, program poprosi mnie o zalogowanie, więc wyraźnie działa tylko pierwsza trasa.

authenticate :user do 
    root :to => "dashboard#index" 
end 
    root :to => "homepage#index" 

Również chcę url aby wskazać www.example.com w obu przypadkach, tak że www.example.com/dashboard/index i www.example.com/homepage/index nigdy nie pojawiają się w przeglądarka.

Dzięki za milion!

Odpowiedz

13

Spróbuj tego, to specyficzne dla Warden/Opracować chociaż.

root to: "dashboard#index", constraints: lambda { |r| r.env["warden"].authenticate? } 
root to: "homepage#index" 
+0

Bardzo dziękuję @Bradley, to mnie zabijało :) –

+0

Robię to samo, ale zarówno zalogowany użytkownik, jak i niezalogowany użytkownik użył dashboard # index –

+1

Ostrzeżenie: To nie działa z Railsami 4, pojawia się komunikat o błędzie: 'Nieprawidłowa nazwa trasy, już używana: 'root'' – Happynoff

5

W swojej HomeController:

def index 
    if !user_signed_in? 
    redirect_to :controller=>'dashboard', :action => 'index' 
    end 
end 
+0

dzięki za odpowiedź @negarnil. Chodzi o to, próbowałem tej opcji, ale nie przepisuje adresu URL. Chcę, aby strona www.example.com wskazywała obie strony, aby strona www.example.com/dashboard/index nigdy nie była wyświetlana. –

+0

Wypróbuj render: action => 'dashboard.html.erb. http://guides.rubyonrails.org/layouts_and_rendering.html#wrapping-it-up –

2

(Exact samo pytanie odpowiedział tutaj: https://stackoverflow.com/a/16233831/930038 Dodawanie odpowiedzi tutaj zbyt odsyłające innych.).

W swojej routes.rb:

authenticated do 
    root :to => 'dashboard#index' 
end 

root :to => 'homepage#index' 

To zapewni, że root_url dla wszystkich uwierzytelnionych użytkowników to dashboard#index

Dla Twojej wygody: https://github.com/plataformatec/devise/pull/1147

+0

W Rails 4 to nie działa. Musisz zmienić nazwę jednej z dwóch tras. Zobacz mój [odpowiedź] (http://stackoverflow.com/a/19090936/1836143). –

2

Oto poprawna odpowiedź z szyn 4

root to: 'dashboard#index', constraints: -> (r) { r.env["warden"].authenticate? }, 
     as: :authenticated_root 
root to: 'homepage#index' 

starałem się dodać to do/edytować zaakceptowane odpowiedź, ale to zbyt wiele edycji zostać przyjęty widocznie. W każdym razie, głosuj na zaakceptowaną odpowiedź (z Bradley), pomógł mi wymyślić ten :)