Festlegen der Geräteanmeldung als Stammseite

82

Ich verwende den folgenden Code für meine Routen:

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

Aber wenn ich abgemeldet bin und gehe, /logouterhalte ich den folgenden Fehler:

Keine Route entspricht {: action => "new" ,: controller => "devise / session"}

Wie richte ich den Root-Pfad für die :sign_inAktion ein?

Logan Bailey
quelle

Antworten:

123

Um den Leuten zu folgen, die nach dem Fehler fragen, Could not find devise mapping for path "/"gibt es eine Problemumgehung.

Sie werden feststellen, dass Ihre Protokolle einen Hinweis enthalten, der wahrscheinlich besagt:

[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]

Also habe ich den Ansatz wiederholt, ihn aber stattdessen (wie @miccet suggets) in einen Bereichsblock eingeschlossen:

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

Das hat bei mir gut funktioniert

Peter Nixey
quelle
6
Dies schickte mich zu einer Endlosschleife, lieber Leser, der das gleiche Problem hat. Der nächste Schritt der Antwort ist hier stackoverflow.com/questions/19855866/…
Jngai1297
91
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

Einfach so, getestet auf Rails Rails 4.1.0.rc1.

VvDPzZ
quelle
1
Ich vermute, dass alles von der Version von Rails and Devise abhängt. Dies funktioniert sicherlich für Rails 4 mit Devise 3 - die meisten anderen Antworten haben dies nicht getan.
Chris Lewis
Ich denke, das ist der beste Weg, es zu tun. Es funktioniert mit Rails 4.2.7.1 und Devise 4.2.0
Luis Lezcano Airaldi
23
root :to => "devise/sessions#new"

Ich musste das Standard-Home-Root festlegen. Ich hatte das Gefühl, ich hätte es letzte Nacht die ganze Nacht versucht (bevor ich die Frage gestellt habe), aber es funktioniert jetzt. Wenn Sie abgemeldet sind, versucht Devise, Sie zu dem von mir nicht definierten Stammpfad umzuleiten.

Logan Bailey
quelle
14
JEDE IDEE WARUM ERHALTE ICH DAS? Es konnte keine Zuordnung für den Pfad "/" gefunden werden. Vielleicht haben Sie vergessen, Ihre Route in den Scope-Block einzuschließen?
Baash05
Es gibt eine Lösung für diesen Fehler "Mapping konnte nicht gefunden werden", den ich der Übersichtlichkeit halber in einer separaten Antwort auf dieser Seite veröffentlicht habe: stackoverflow.com/a/12994856/400790
Peter Nixey
15

(Dies wurde als Änderungsvorschlag veröffentlicht, hätte aber eine eigene Antwort sein sollen. Ich weiß nicht, ob es sinnvoll ist oder nicht. Sehr geehrter anonymer Redakteur, zögern Sie nicht, diese Antwort als Ihre eigene zu veröffentlichen und mir einen Kommentar zu hinterlassen also werde ich diese Kopie löschen.)

root :to => redirect("/users/login")
Gilles
quelle
3
Bitte beachten Sie, dass diese Route eine Umleitung ist. Die Anmeldeseite in der Stamm-URL wird nicht angezeigt. Dazu müssen Sie die Route devise_scope: user do root: to => "devise / session # new" erstellen, wie von @PeterNixey
Robert
11

Ich habe dies mit @VvDPzZ Antwort zu arbeiten. Aber ich musste es leicht modifizieren

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

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

Ich musste to:in der Root-Pfad-Deklaration angeben. Ich habe das auch entfernt, as: :authenticated_rootweil ich bereits einige Stellen in meiner Anwendung hatte, die root_pathauf Links verweisen . Durch das Weglassen des as: :authenticated_rootTeils musste ich keinen meiner vorhandenen Links ändern.

Doug Steinberg
quelle
3

Ich denke, Sie haben verschiedene Benutzerrollen. Wenn Sie dies tun, müssen Sie der Benutzerressource einen solchen Bereich hinzufügen:

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

Weitere Informationen zum Überschreiben von Routen finden Sie hier: https://github.com/plataformatec/devise/wiki/How-To:-Change-the-default-sign_in-and-sign_out-routes

Miccet
quelle
Es ist nicht so sehr, dass ich nicht auf die Abmelderoute zugreifen kann. Wenn Sie abgemeldet sind, leitet Sie die Abmelderoute zum Root weiter.
Logan Bailey
1

Einige dieser Lösungen sind viel zu komplex. Verwenden Sie einfach Rails:

In 'get' 'users/root', to: 'users#root'zu config / routes.rb.

Führen Sie in UsersController Folgendes aus:

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
Jesse Farmer
quelle
0

Mit Rails 3.2 und Device 3.2.3 kann ich meine Homepage " Home # Index " (Controller # Aktion) als Anmeldeseite einrichten und die folgenden Änderungen vornehmen.

# 1 Das Anmeldeformular wurde zur Startseite hinzugefügt:

<%= 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 Methoden Ressourcenname, Ressource und Gerätezuordnung zu app / holdpers / application_helper.rb hinzugefügt :

def resource_name
  :user
end

def resource
  @resource ||= User.new
end

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

# 3 Erstellt eine benutzerdefinierte Sitzungscontroller- App / controller / 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 Überspringen Sie die Sitzungsrouten und richten Sie den benutzerdefinierten Sitzungscontroller in config / route.rb ein :

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
Rui Castro
quelle