2011-02-10 8 views
65

Używam następujący kod dla moich trasach:Ustawianie Devise Zaloguj się korzeń strona

devise_for :user, 
    :as => '', 
    :path_names => { 
    :sign_in => "", 
    :sign_out => "logout", 
    :sign_up => "register" 
    } 

Ale gdy jestem wylogowany i ja goto /logout pojawia się następujący błąd:

No route matches {:action=>"new", :controller=>"devise/sessions"}

Jak skonfigurować ścieżkę główną do działania na :sign_in?

Odpowiedz

99

Aby podążać dalej od ludzi, którzy proszą o błędzie Could not find devise mapping for path "/" istnieje obejście.

Przekonasz się, że nie ma pojęcia, w dziennikach, które prawdopodobnie powie:

[Devise] Could not find devise mapping for path "/". 
This may happen for two reasons: 

1) You forgot to wrap your route inside the scope block. For example: 

    devise_scope :user do 
    match "/some/route" => "some_devise_controller" 
    end 

2) You are testing a Devise controller bypassing the router. 
    If so, you can explicitly tell Devise which mapping to use: 

    @request.env["devise.mapping"] = Devise.mappings[:user] 

Więc ponowiona podejście ale zamiast owijając go (jak @miccet suggets) wewnątrz bloku zakres:

devise_scope :user do 
    root to: "devise/sessions#new" 
end 

to działało w porządku dla mnie

+3

Ten wysłał mnie do nieskończonej pętli, drogi czytelniku kto ma ten sam problem, następnym krokiem jest odpowiedź http://stackoverflow.com/questions/19855866/how-to-set-devise-sign-in-page-as-root-page-in-rails – Jngai1297

3

Podejrzewam, że masz różne role użytkowników. Jeśli nie masz, aby dodać zakres jak to do zasobu użytkowników:

devise_scope :user do 
    get "/logout" => "devise/sessions#destroy" 
    end 

można przeczytać więcej o nadrzędnym opracowania tras tutaj: https://github.com/plataformatec/devise/wiki/How-To:-Change-the-default-sign_in-and-sign_out-routes

+0

to nie jest tak dużo, że nie można uzyskać dostępu do trasy wylogowania. To jest, gdy jesteś wylogowany, wylogowanie trasy przekierowuje cię do roota. –

23
root :to => "devise/sessions#new" 

Musiałem ustawić domyślny korzeń domu . Czułem się tak, jakbym próbował tej nocy całą noc (przed opublikowaniem pytania), ale teraz działa. Jeśli jesteś wylogowany, Devise próbuje przekierować cię do ścieżki głównej, której nie zdefiniowałem.

+13

KAŻDY POMYSŁ, DLACZEGO WIDZĘ TEN? Nie można znaleźć mapy dla ścieżki "/". Może zapomniałeś zawinąć swoją trasę do bloku zasięgu? – baash05

+0

Istnieje rozwiązanie tego błędu "nie można znaleźć wymyślić", które ze względu na przejrzystość zamieściłem w osobnej odpowiedzi na tej stronie: http://stackoverflow.com/a/12994856/400790 –

+0

odpowiedź brzmi: tuż poniżej .. – Nithin

13

(ten został opublikowany jako suggested edit, ale powinna być odpowiedź z własnym ja nie wiem, czy ma to sens czy nie Szanowny redaktor anonimowy.. Krępuj się odśwież tę odpowiedź jako własne, i zostawić komentarz więc będę usunąć tę kopię.)

root :to => redirect("https://stackoverflow.com/users/login") 
+3

Pamiętaj, że ta trasa jest przekierowaniem. Nie wyświetla strony logowania na głównym adresie URL. Aby to zrobić, trzeba utworzyć trasę devise_scope: Użytkownik zrobić root: do => "/ sesje # opracować nowy" końcowych jak sugeruje @PeterNixey – Robert

72
devise_for :users 

devise_scope :user do 
    authenticated :user do 
    root 'home#index', as: :authenticated_root 
    end 

    unauthenticated do 
    root 'devise/sessions#new', as: :unauthenticated_root 
    end 
end 

Podobnie jak to, testowane na Rails Rails 4.1 .0.rc1.

+1

Podejrzewam, że wszystko zależy od wersji Rails and Devise. To z pewnością działa dla Rails 4 z Devise 3 - większość innych odpowiedzi nie. –

+0

Myślę, że jest to najlepszy sposób na zrobienie tego. Działa z Railsami 4.2.7.1 i Devise 4.2.0 – luislezcair

+0

Świetnie! Podoba mi się ten kod. Dziękuję Ci. – Penguin

0

Korzystanie szyny 3.2 i devise 3.2.3 ja kieruję konfiguracji mojej stronie „domu Wskaźnik” (kontroler # działania) jako strony logowania dokonania następujących zmian.

# 1 Dodany formularz logowania na stronie głównej:

<%= simple_form_for(resource, as: resource_name, url: session_path(resource_name)) do |f| %> 
    <%= f.input :email %> 
    <%= f.input :password %> 
    <%= f.button :submit %> 
<% end %> 

# 2 Dodano metody RESOURCE_NAME, zasobów i devise_mapping do app/heldpers/application_helper.rb:

def resource_name 
    :user 
end 

def resource 
    @resource ||= User.new 
end 

def devise_mapping 
    @devise_mapping ||= Devise.mappings[:user] 
end 

# 3 Utworzony niestandardowe sesje kontroler app/controllers/users/sessions_controller.rb:

class Users::SessionsController < Devise::SessionsController 

    protected 

    # This method tell sessions#create method to redirect to home#index when login fails. 
    def auth_options 
     { scope: resource_name, recall: 'home#index' } 
    end 

end 

# 4 Przejdź trasach sesji i konfiguracja zwyczaj kontroler sesji w config/routes.rb:

devise_for :users, path: 'auth', skip: [:sessions], 
      controllers: { 
       sessions: 'users/sessions' 
      } 

as :user do 
    get 'auth/sign_in' => 'home#index', as: :new_user_session 
    post 'auth/sign_in' => 'users/sessions#create', as: :user_session 
    delete 'auth/sign_out' => 'users/sessions#destroy', as: :destroy_user_session 
end 
9

Mam to do pracy z odpowiedzią @VvDPzZ. Ale musiałam go zmodyfikować nieco

devise_scope :business_owner do 
    authenticated do 
     root to: 'pages#dashboard' 
    end 

    unauthenticated do 
     root to: 'devise/sessions#new', as: 'unauthenticated_root' 
    end 
    end 

musiałem reklamy to: w deklaracji ścieżki korzeń. Usunąłem także as: :authenticated_root, ponieważ już miałem kilka miejsc w mojej aplikacji odwołujących się do linków w odniesieniu do root_path. Pomijając część as: :authenticated_root, nie musiałem zmieniać żadnych istniejących linków.

0

Niektóre z tych rozwiązań są zbyt złożone. Po prostu użyj swoich umiejętności Railsowych, aby uderzyć Devise do góry głową:

Dodaj 'get' 'users/root', to: 'users#root' do config/routes.rb.

W UsersController zrobić coś takiego:

def root 
    if user_signed_in? 
    redirect_to root_for_signed_in_user_path (or whatever) 
    else 
    redirect_to new_user_session_path 
    end 
end 
Powiązane problemy