it-swarm.com.de

Keine Route stimmt mit "/ users / sign_out" überein Rails 3

Ich habe devise auf meiner App installiert und Folgendes in meiner application.html.erb - Datei angewendet:

<div id="user_nav">
    <% if user_signed_in? %>
        Signed in as <%= current_user.email %>. This cannot be cheese?
        <%= link_to 'Sign out', destroy_user_session_path %>
    <% else %>
        <%= link_to 'Register', new_user_registration_path %> or <%= link_to 'Sign in', new_user_session_path %>
    <% end %>
</div>

Ich habe rake routes Ausgeführt und bestätigt, dass alle Routen gültig sind.

Außerdem habe ich in meiner routes.rb - Datei devise_for :users Und root :to => "home#index".

Ich erhalte den folgenden Routing-Fehler, wenn ich auf den Link "Abmelden" klicke:

No route matches "/users/sign_out"

Irgendwelche Ideen, was den Fehler verursacht?

384
vich

Ich denke, die Route zum Abmelden ist eine DELETE Methode. Dies bedeutet, dass Ihr Abmeldelink so aussehen muss:

<%= link_to "Sign out", destroy_user_session_path, :method => :delete %>

Ihr Teil :method => :delete Ist nicht enthalten. Beachten Sie auch, dass Sie dazu auch <%= javascript_include_tag :defaults %> In Ihre Layout-Datei aufnehmen müssen (application.html.erb).

564
Jessie Dedecker

Ich habe diese Zeile in devise.rb geändert:

config.sign_out_via = :delete

zu

config.sign_out_via = :get

und es begann für mich zu arbeiten.

132
kitdesai

Sie haben wahrscheinlich nicht jquery_ujs Javascript-Datei enthalten. Stellen Sie sicher, dass Sie die neueste Version von jquery-ujs verwenden: https://github.com/Rails/jquery-ujs und die letzten verfügbaren Dateien:

Rails generate jquery:install

Sie sollten keine Rails.js-Datei mehr haben . Wenn Sie dies tun, sind Sie wahrscheinlich veraltet. Stellen Sie sicher, dass auch diese Datei mit den Standardeinstellungen in config/application.rb geladen ist

config.action_view.javascript_expansions[:defaults] = %w(jquery.min jquery_ujs)

(Auch hier sollten Sie keine Rails.js-Datei haben). Fügen Sie zum Schluss den Link hinzu, wie auf Wiki erstellen (haml-style) dokumentiert:

= link_to('Logout', destroy_user_session_path, :method => 'delete')

Und alles wird gut.

60
Gravis

Die Möglichkeit, den Logout-Link zu einem DELETE RESTful-Aufruf zu machen, erfordert ein HTML-Attribut data-method = "delete" Unter Verwendung des Rails code = link_to('Logout', destroy_user_session_path, :method => :delete).

Wenn Sie jedoch das Juwel jquery-ujs Nicht installiert haben oder das resultierende Javascript in Ihrer application.html nicht über = javascript_include_tag "application" Aufrufen, wird die Antwort als GET-Anfrage gesendet, und die Route wird Scheitern.

Sie haben einige Optionen, wenn Sie jquery-ujs Nicht verwenden möchten oder keine Möglichkeit finden, dies zu erreichen:

  1. Ändern Sie config.sign_out_via In :get Auf den Wert devise.rb (Nicht empfohlen, da DELETE die entsprechende RESTful-Abfrage ist).
  2. ODER Ändern Sie den link_to In = button_to('Logout', destroy_user_session_path, :method => :delete). Mit button_to Rails erledigt den richtigen DELETE-Aufruf. Sie können den Button dann so gestalten, dass er wie ein Link aussieht, wenn Sie es wünschen.
31
Will Nathan

Fügen Sie eine neue Route hinzu, um/sessions # destroy zu erstellen und eine Verknüpfung zu dieser Route herzustellen. Z.B:

routes.rb
devise_for :users do
  get 'logout' => 'devise/sessions#destroy'
end

aussicht:

<%= link_to "Logout", logout_path %>
24
Kevin Tsoi

Ich hatte das gleiche Problem mit Rails 3.1.0, und ich habe das Hinzufügen der folgenden Zeilen in der Datei gelöst:

app/assets/javascripts/application.js
//= require_tree
//= require jquery
//= require jquery_ujs
13
gringo

Verwenden Sie es in Ihrer routes.rb-Datei:

devise_for :users do
    get '/users/sign_out' => 'devise/sessions#destroy'
end
13

Mit einer Ausnahme hat Jessies Antwort für mich funktioniert:

<%= link_to "Sign out", destroy_user_session_path, :method => :delete %>

veränderung:

:delete

... zu:

'delete'

Der Code, der für mich funktioniert hat, ist:

<%= link_to "Sign out", destroy_user_session_path, :method => 'delete' %>
10
Galen

Viele Antworten auf die Frage schon. Für mich war das Problem zweifach:

  1. wenn ich meine Routen erweitere:

    devise_for :users do 
       get '/users/sign_out' => 'devise/sessions#destroy'
    end
    
  2. Ich wurde gewarnt, dass dies abgeschrieben wird, so habe ich es ersetzt durch:

    devise_scope :users do
       get '/users/sign_out' => 'devise/sessions#destroy'
    end
    
  3. Ich dachte, ich werde meine jQuery entfernen. Schlechte Wahl. Das Gerät verwendet jQuery, um die DELETE-Anforderung zu "fälschen" und als GET zu senden. Deshalb müssen Sie:

    //= require jquery
    //= require jquery_ujs
    
  4. und natürlich derselbe Link wie schon erwähnt:

    <%= link_to "Sign out", destroy_user_session_path, :method => :delete %>
    
9
Lukasz Muzyka

Hinzufügen:

  <%= csrf_meta_tag %>  and 
  <%= javascript_include_tag :defaults %>  to layouts

Verwenden Sie diese link_to-Tags

 link_to 'Sign out', destroy_user_session_path, :method => :delete

  or

 link_to 'Sign out', '/users/sign_out', :method => :delete

In Routen hinzufügen:

  devise_for :users do
    get '/users/sign_out' => 'devise/sessions#destroy'
  end
7
Amal Kumar S

Eine andere Möglichkeit ist, die Abmeldung als GET statt als DELETE zu konfigurieren. Fügen Sie dazu die folgende Zeile in /config/initializers/devise.rb Ein.

config.sign_out_via = :get

Aber wie Steve Klabnik in seinem Blog schrieb (http://blog.steveklabnik.com/2011/12/11/devise-actioncontroller-routingerror-no-route-matches-get-slash-users-slash-sign-out.html) ) versuchen Sie wegen der Semantik dieser Methode DELETE zu verwenden.

7
Rodrigo Flores

Wenn Sie Rails 3.1 verwenden, stellen Sie sicher, dass Ihre application.html.erb-Abmeldung wie folgt aussieht:

<%= link_to "Sign out", destroy_user_session_path, :method => :delete %>

Und dass Ihre Javascript-Include-Zeile wie folgt aussieht

<%= javascript_include_tag 'application' %>

Ich vermute, dass einige Edelsteine ​​die neue Struktur des Speicherorts default.js überschreiben.

6
StlTenny

Naja, Leute für mich war es nur die: Methode =>: löschen zu entfernen

<%= link_to('Sign out', destroy_user_session_path) %>
5
workdreamer

Ich möchte hinzufügen, obwohl es ein bisschen alt ist.

der "sign_out" -Link funktionierte trotz: method =>: delete nicht.

Der Kommentar, der angibt, dass <%= javascript_include_tag :defaults %> Enthalten sein muss, erinnerte mich daran, dass ich kürzlich JQuery Java script hinzugefügt und einfache <script src=""/> - Tags verwendet habe, um sie einzuschließen.

Als ich sie von den Standardeinstellungen nach ":" auf "before" verschoben habe, hat "sign_out" wieder funktioniert.

Hoffentlich hilft das jemandem.

5
Greg

Vergessen Sie nicht, die folgende Zeile in Ihre application.js (Rails 3) aufzunehmen.

//= require_self
//= require jquery
//= require jquery_ujs

Füge jquery_ujs In meine Rails) Anwendung ein und es funktioniert jetzt.

5
The Lazy Log

Dies bedeutet, dass Sie die jquery-Dateien nicht generiert haben, nachdem Sie das jquery-Rails-Gem installiert haben. Also müssen Sie es zuerst generieren.

Rails generate devise:install

Erste Wahl:

Dies bedeutet, dass Sie entweder die folgende Zeile in /config/initializers/devise.rb Ändern müssen.

config.sign_out_via =: Löschen in config.sign_out_via =: Holen

Zweite Option:

Sie ändern diese Zeile <%= link_to "Sign out", destroy_user_session_path %> In der Ansichtsdatei nur in <%= link_to "Sign out", destroy_user_session_path, :method => :delete %>.

Normalerweise wird :method => :delete Nicht standardmäßig geschrieben.

5

Die meisten Antworten sind unvollständig. Ich habe dieses Problem oft getroffen. Zwei Dinge müssen angesprochen werden:

<%= link_to(t('logout'), destroy_user_session_path, :method => :delete) %>

die Löschmethode muss angegeben werden

Dann verwendet devise jquery, so dass Sie diese laden müssen

   <%= javascript_include_tag "myDirectiveJSfile" %> 

und stellen Sie sicher, dass BOTH jquery und jquery-ujs in Ihrer Datei myDirectiveJSfile.js angegeben sind

//= require jquery
//= require jquery_ujs
5
Jerome

Probieren Sie es mit dem Quellcode in github aus:

https://github.com/plataformatec/devise/commit/adb127bb3e3b334cba903db2c21710e8c41c2b40#lib/generators/templates/devise.rb (Datum: 27. Juni 2011)

  • # Die Standard-HTTP-Methode zum Abmelden einer Ressource. Standard ist: get. 188
  • # config.sign_out_via =: Erhalte 187
  • # Die Standard-HTTP-Methode zum Abmelden einer Ressource. Standard ist: löschen. 188
  • config.sign_out_via =: löschen
5
Shane

Wenn Sie HTTPS mit devise verwenden, kommt es zum Absturz, wenn sich Ihr Abmeldelink auf die nicht sichere Version bezieht. Auf dem Back-End wird auf die sichere Version umgeleitet. Diese Weiterleitung ist ein GET, das das Problem verursacht.

Stellen Sie sicher, dass Ihr Link HTTPS verwendet. Du kannst es erzwingen mit protocol: "https" in Ihrem URL-Helfer (stellen Sie sicher, dass Sie den URL-Helfer und nicht den Pfad-Helfer verwenden).

<%= link_to "Sign out", destroy_user_session_url(protocol: "https"), method: :delete %>
4
Tyler Collier
  devise_for :users
  devise_scope :user do
    get '/users/sign_out' => 'devise/sessions#destroy'
  end
4
dipole_moment

Es gibt viele Lösungen. aber meistens verwenden,

<%= link_to 'Sign out', destroy_user_session_path, method: :delete %>

oder config devise.rb mit der richtigen sign_out Methode

In devise.rb

config.sign_out_via = :delete ( or  :get which u like to use.) 
3
jon snow

verwenden :get und :delete Methode für Ihren Pfad:

devise_scope :user do
  match '/users/sign_out' => 'devise/sessions#destroy', :as => :destroy_user_session, via: [:get, :delete]
end
3
Zakaria

Das Problem beginnt mit Rails 3.1 ... in /app/assets/javascript/ Nur nach application.js suchen.

Wenn die Datei nicht existiert, erstelle eine Datei mit diesem Namen. Ich weiß nicht, warum meine Datei verschwindet oder nie auf "Rails new app"... Erstellt wurde.

Diese Datei ist die Instanz für jquery....

3
rome3ro

Das habe ich gemacht (mit Rails 3.0 und Devise 1.4.2)):

  1. Stellen Sie sicher, dass Ihre Seite Rails.js lädt
  2. Verwenden Sie diesen Parameter: 'data-method' => 'delete'
  3. Gute Idee, diesen Parameter hinzuzufügen:: rel => 'nofollow'
2
Larry

In Ihrer routes.rb:

 devise_for :users do
    get '/sign_out' => 'devise/sessions#destroy'
    get '/log_in' => 'devise/sessions#new'
    get '/log_out' => 'devise/sessions#destroy'
    get '/sign_up' => 'devise/registrations#new'
    get '/edit_profile' => 'devise/registrations#edit'
 end

und in deiner application.html.erb:

<%if user_signed_in?%>
          <li><%= link_to "Sign_out", sign_out_path %></li>
<% end %>
2
Matz Heri

Sehen Sie nach, ob Ihre routes.rb eine "resource: users" vor einer "devise_for: users" hat, und versuchen Sie, diese auszutauschen:

  1. Funktioniert

    • devise_for: benutzer
    • ressourcen: Benutzer
  2. Schlägt fehl

    • ressourcen: Benutzer
    • devise_for: benutzer
1
Charles Magid

Ich weiß, dass dies eine alte Frage ist, die auf Rails 3 basiert, aber ich bin gerade auf Rails 4.0.4) gestoßen und habe sie gelöst Wie habe ich das Problem behoben? Ihr Kilometerstand kann variieren, aber hier ist, was für mich funktioniert hat.

Stellen Sie zunächst sicher, dass Sie die Gems installiert haben, und führen Sie die Bundle-Installation aus.

gem 'jquery-Rails'

gem 'turbolinks'

gem 'jquery-turbolinks'

Überprüfen Sie in application.js, ob alles wie folgt erforderlich ist.

Vorsicht, wenn das hier stimmt: es ist //= require jquery.turbolinks und nicht //= require jquery-turbolinks

//= require jquery
//= require jquery_ujs
//= require jquery.turbolinks
//= require turbolinks
//= require_tree .

Fügen Sie als Nächstes die entsprechenden Links im Header von application.html.erb hinzu.

<%= javascript_include_tag  "application", "data-turbolinks-track" => true %>
<%= javascript_include_tag :defaults %>

Es scheint viele Variationen bei der Implementierung der Löschmethode zu geben, von denen ich annehme, dass sie von der Version von Rails) abhängt. Dies ist die delete -Syntax, die ich verwendet habe.

<p><%= link_to "Sign Out", destroy_user_session_path, :method => 'delete' %></p>

Hoffe, das hilft, jemanden aus diesem sehr frustrierenden Loch herauszuholen!

1
mikeym

das ':method => :delete 'in Seite ist' data-method="delete" 'Damit Ihre Seite jquery_ujs.js haben muss, sendet sie einen Link mit der Methode delete, nicht mit der Methode get

1
user1599712

Im Allgemeinen, wenn Sie "Keine Routenübereinstimmungen" erhalten, aber glauben, dass Sie diese Route definiert haben, überprüfen Sie die http-Verb-/Anforderungsmethode (ob sie für diese Route abgerufen, abgelegt, gepostet, gelöscht usw. .

Wenn Sie Rake-Routen ausführen, sehen Sie die erwartete Methode und können diese mit dem Anforderungsprotokoll vergleichen.

0
Muntasim