Ustawienie Devise Login jako strona główna


84

Używam następującego kodu dla moich tras:

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

Ale kiedy jestem wylogowany i dostaję się, pojawia /logoutsię następujący błąd:

Żadna trasa nie pasuje {: action => "new",: controller => "devise / session"}

Jak ustawić ścieżkę główną do :sign_indziałania?

Odpowiedzi:


125

Aby kontynuować od osób, które pytają o błąd, Could not find devise mapping for path "/"istnieje obejście.

Przekonasz się, że w twoich dziennikach znajduje się wskazówka, która 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]

Spróbowałem więc ponownie zastosować podejście, ale zamiast tego zawijając je (jako sugestie @miccet) wewnątrz bloku zakresu:

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

To działało dobrze dla mnie


6
To wysłało mnie do nieskończonej pętli, drogi czytelniku, który ma ten sam problem, następny krok odpowiedzi jest tutaj stackoverflow.com/questions/19855866/ ...
Jngai1297

93
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

Dokładnie tak, 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.
Chris Lewis,

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

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

Musiałem ustawić domyślny katalog główny. Czułem się, jakbym próbował tego całą noc wczoraj (przed opublikowaniem pytania), ale teraz działa. Jeśli jesteś wylogowany, Devise spróbuje przekierować Cię do ścieżki głównej, której nie zdefiniowałem.


14
JAKIEKOLWIEK POMYSŁ, DLACZEGO MAM TO? Nie można znaleźć odwzorowania urządzenia dla ścieżki „/”. Może zapomniałeś zawinąć swoją trasę wewnątrz bloku lunety?
baash05

Jest rozwiązanie tego błędu "nie można znaleźć mapowania urządzenia", które dla jasności zamieściłem w osobnej odpowiedzi na tej stronie: stackoverflow.com/a/12994856/400790
Peter Nixey

15

(Zostało to opublikowane jako sugerowana zmiana , ale powinna była być odpowiedzią samą w sobie. Nie wiem, czy to ma sens, czy nie. Drogi anonimowy redaktorze: nie krępuj się opublikować ponownie tę odpowiedź jako własną i zostaw komentarz więc usunę tę kopię.)

root :to => redirect("/users/login")

3
Należy pamiętać, że ta trasa jest przekierowaniem. Nie wyświetla strony logowania pod głównym adresem URL. Aby to zrobić, musisz utworzyć trasę devise_scope: user do root: to => "devise / session # new" end zgodnie z sugestią @PeterNixey
Robert

11

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

  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 umieścić reklamę to:w deklaracji ścieżki głównej. Usunąłem również, as: :authenticated_rootponieważ miałem już kilka miejsc w mojej aplikacji odwołujących się root_pathdo linków. Pomijając tę as: :authenticated_rootczęść, nie musiałem zmieniać żadnego z moich istniejących linków.


3

Myślę, że masz różne role użytkowników. Jeśli musisz dodać taki zakres do zasobów użytkowników:

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

Możesz przeczytać więcej o zastępowaniu tras opracowanych tutaj: https://github.com/plataformatec/devise/wiki/How-To:-Change-the-default-sign_in-and-sign_out-routes


Nie chodzi o to, że nie mam dostępu do trasy wylogowania. Gdy jesteś wylogowany, trasa wylogowania przekierowuje cię do roota.
Logan Bailey,

1

Niektóre z tych rozwiązań są zbyt skomplikowane. Po prostu użyj Rails:

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

W UsersController zrób 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

0

Używając rails 3.2 i devise 3.2.3 udaje mi się ustawić moją stronę domową " home # index " (kontroler # action) jako stronę logowania, wprowadzając następujące zmiany.

# 1 Dodano formularz logowania do strony 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 nazwa_zasobu, zasób i odwzorowanie_wyrządzenia do pliku app / holdpers / application_helper.rb :

def resource_name
  :user
end

def resource
  @resource ||= User.new
end

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

# 3 Utworzono niestandardową aplikację kontrolera sesji / controllers / users / session_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 Pomiń trasy sesji i skonfiguruj kontroler sesji niestandardowych w config / tours.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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.