Ich habe devise auf meiner App installiert und Folgendes in meine application.html.erb
Datei übernommen:
<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 lief rake routes
und bestätigte, dass alle Routen gültig sind.
Auch in meiner routes.rb
Datei habe ich devise_for :users
und root :to => "home#index"
.
Beim Klicken auf den Link "Abmelden" wird der folgende Routing-Fehler angezeigt:
No route matches "/users/sign_out"
Irgendwelche Ideen, was den Fehler verursacht?
gem 'devise', :git => 'git://github.com/plataformatec/devise.git'
. Das hat aber nichts gebracht.Antworten:
Ich denke, der Weg zum Abmelden ist eine
DELETE
Methode. Dies bedeutet, dass Ihr Abmeldelink folgendermaßen aussehen muss:Ihr Teil ist nicht enthalten
:method => :delete
. Bitte beachten Sie auch, dass Sie dies auch einschließen müssen, damit dies funktioniert<%= javascript_include_tag :defaults %>
in Ihre Layoutdatei (application.html.erb
) aufnehmen .quelle
link_to "Sign out", destroy_user_session_path
war immer gut genug für mich.$("<a href='/users/sign_out' data-method='delete'>Sign out</a>").appendTo('body');
- wenn jQuery auf der Seite geladen ist.Ich habe diese Zeile in devise.rb geändert:
zu
und es fing an, für mich zu arbeiten.
quelle
config.sign_out_via = [ :post, :delete ]
oderdevise_for :users, :sign_out_via => [ :post, :delete ]
, wie in devise / Rails / Routen.rb beschrieben .Sie haben wahrscheinlich keine Jquery_ujs-Javascript-Datei hinzugefügt. Stellen Sie sicher, dass Sie die neueste Version von jquery-ujs verwenden: https://github.com/rails/jquery-ujs und die letzten verfügbaren Dateien:
Sie sollten keine Datei rails.js 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
(Auch hier sollten Sie keine Datei rails.js haben). Fügen Sie zum Schluss den Link hinzu, der im Devise-Wiki (Haml-Stil) dokumentiert ist :
Und alles wird gut.
quelle
javascript_include_tag "jquery_ujs"
application.js
. Schlechte Annahme, nehme ich an. Vielen Dank.Die Möglichkeit, den Logout-Link zu einem DELETE RESTful-Aufruf zu machen, erfordert ein HTML-Attribut
data-method = "delete"
unter Verwendung des Rails-Codes= link_to('Logout', destroy_user_session_path, :method => :delete)
.Wenn Sie das Gem jedoch nicht
jquery-ujs
installiert haben oder das resultierende Javascript in Ihrer application.html nicht über aufrufen= javascript_include_tag "application"
, wird die Antwort als GET-Anforderung gesendet und die Route schlägt fehl.Sie haben einige Optionen, wenn Sie sie nicht verwenden möchten
jquery-ujs
oder keine Möglichkeit finden, sie zum Laufen zu bringen:config.sign_out_via
zu gleich:get
innerhalbdevise.rb
(nicht empfohlen, da DELETE die entsprechende RESTful-Abfrage ist).link_to
in= button_to('Logout', destroy_user_session_path, :method => :delete)
. Mitbutton_to
Rails wird das schwere Heben ausgeführt, um den richtigen DELETE-Anruf zu tätigen. Sie können die Schaltfläche dann so gestalten, dass sie wie ein Link aussieht, wenn Sie dies wünschen.quelle
button_to
Rails generiert einform
für die gesamte Aktion. Aus diesem Grund ist es möglich,:delete
Methoden mitbutton_to
und nicht mit zu verwendenlink_to
. Sehen Sie sich nur den generierten HTML-Code an.Versuchen Sie, eine neue Route hinzuzufügen, um / session # destroy zu erstellen und eine Verknüpfung dazu herzustellen. Z.B:
Aussicht:
quelle
link_to
Aufruf einfach einen separaten Parameter hinzufügen , wie in der anderen Antwort beschrieben.Verwenden Sie es in Ihrer Datei route.rb:
quelle
Ich hatte das gleiche Problem mit Rails 3.1.0 und habe das Hinzufügen der folgenden Zeilen in der Datei gelöst:
quelle
Mit einer Ausnahme hat Jessies Antwort für mich funktioniert:
Veränderung:
... zu:
Der Code, der für mich funktioniert hat, lautet also:
quelle
Viele Antworten auf die Frage schon. Für mich war das Problem zweifach:
wenn ich meine Routen erweitere:
Ich wurde gewarnt, dass dies abgeschrieben wird, daher habe ich es ersetzt durch:
Ich dachte, ich werde meine jQuery entfernen. Schlechte Wahl. Devise verwendet jQuery, um eine DELETE-Anfrage zu "fälschen" und als GET zu senden. Deshalb müssen Sie:
und natürlich derselbe Link wie viele zuvor erwähnte:
quelle
Hinzufügen:
Verwenden Sie diese link_to-Tags
In Routen hinzufügen:
quelle
Eine andere Möglichkeit besteht darin, die Abmeldung als GET statt als DELETE zu konfigurieren. Dazu können Sie die folgende Zeile hinzufügen
/config/initializers/devise.rb
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.
quelle
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 Standorts default.js überschreiben.
quelle
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)
quelle
Nun, Leute für mich war es nur die: Methode =>: löschen
quelle
Dies bedeutet, dass Sie die JQuery-Dateien nach der Installation des JQuery-Rails-Gems nicht generiert haben. Also müssen Sie es zuerst generieren.
rails generate devise:install
Erste Wahl:
Dies bedeutet, dass Sie entweder die folgende Zeile ändern müssen
/config/initializers/devise.rb
config.sign_out_via =: löschen zu config.sign_out_via =: get
Zweite Option:
Sie ändern diese Zeile nur
<%= link_to "Sign out", destroy_user_session_path %>
in<%= link_to "Sign out", destroy_user_session_path, :method => :delete %>
der Ansichtsdatei.Normalerweise
:method => :delete
wird nicht standardmäßig geschrieben.quelle
Ich möchte noch etwas hinzufügen, obwohl es ein bisschen alt ist.
Der Link "sign_out" funktionierte nicht, obwohl: method =>: delete.
Der Kommentar, der angibt, dass enthalten sein
<%= javascript_include_tag :defaults %>
muss, erinnerte mich daran, dass ich kürzlich ein JQuery-Java-Skript hinzugefügt und einfache<script src=""/>
Tags verwendet hatte, um sie einzuschließen .Als ich sie von nach den Standardeinstellungen von: auf vorher verschoben habe, hat sign_out wieder funktioniert.
Hoffentlich hilft das jemandem.
quelle
Die meisten Antworten sind teilweise. Ich habe dieses Problem oft getroffen. Zwei Dinge müssen angesprochen werden:
Die Löschmethode muss angegeben werden
Dann verwendet devise jquery, sodass Sie diese laden müssen
und stellen Sie sicher, dass BEIDE jquery und jquery-ujs in Ihrer myDirectiveJSfile.js angegeben sind
quelle
Vergessen Sie nicht, die folgende Zeile in Ihre application.js (Rails 3) aufzunehmen.
Fügen Sie
jquery_ujs
in meine Rails - Anwendung und es funktioniert jetzt.quelle
Wenn Sie HTTPS mit Gerät verwenden , wird es unterbrochen, wenn Ihr Abmeldelink auf die nicht sichere Version verweist. Im Backend wird zur sicheren Version umgeleitet. Diese Weiterleitung ist ein GET, das das Problem verursacht.
Stellen Sie sicher, dass Ihr Link HTTPS verwendet. Sie können es
protocol: "https"
in Ihrem URL-Helfer erzwingen (stellen Sie sicher, dass Sie den URL-Helfer und nicht den Pfad-Helfer verwenden).quelle
quelle
Das Problem beginnt mit Schienen 3.1 ... in
/app/assets/javascript/
suchen Sie einfach nach application.js.Wenn die Datei nicht vorhanden ist, erstellen Sie eine Datei mit diesem Namen. Ich weiß nicht, warum meine Datei verschwindet oder nie erstellt wurde
"rails new app"...
.Diese Datei ist die Instanz für
jquery...
.quelle
Es gibt viele Lösungen. aber meistens benutze dies,
oder config devise.rb mit der richtigen sign_out-Methode
In devise.rb
quelle
Verwendung
:get
und:delete
Methode für Ihren Pfad:quelle
In Ihren Routen.rb:
und in Ihrer application.html.erb:
quelle
Folgendes habe ich getan (mit Rails 3.0 und Devise 1.4.2):
quelle
Überprüfen Sie, ob Ihre route.rb vor einem "devise_for: users" eine "resource: users" hat, und tauschen Sie sie aus:
Funktioniert
Schlägt fehl
quelle
Die
':method => :delete
'in Seite ist'data-method="delete"
', also muss Ihre Seite jquery_ujs.js haben, es wird ein Link mit der Methode delete not method get gesendetquelle
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. Also dachte ich, ich würde darüber nachdenken, wie ich es für jeden behoben habe, der auf dieses Problem mit dieser Version stößt. Ihr Kilometerstand kann variieren, aber hier ist, was für mich funktioniert hat.
Stellen Sie zunächst sicher, dass Sie die Edelsteine installiert haben, und führen Sie die Bundle-Installation aus.
Überprüfen Sie in application.js, ob alles wie unten angegeben erforderlich ist.
Passen Sie auf, wenn dies ein Fall ist : Es ist
//= require jquery.turbolinks
und nicht//= require jquery-turbolinks
Fügen Sie als Nächstes die entsprechenden Links in die Kopfzeile von application.html.erb ein.
Es scheint viele Variationen bei der Implementierung der Löschmethode zu geben, von der ich annehme, dass sie von der von Ihnen verwendeten Rails-Version abhängt. Dies ist die
delete
Syntax, die ich verwendet habe.Hoffe, das hilft jemandem aus diesem sehr frustrierenden Loch zu graben!
quelle
Wenn Sie "Keine Routenübereinstimmungen" erhalten, aber glauben, diese Route definiert zu haben, überprüfen Sie im Allgemeinen die http-Verb- / Anforderungsmethode (ob get, put, post, delete usw.) für diese Route .
Wenn Sie Rake-Routen ausführen, wird die erwartete Methode angezeigt und Sie können diese mit dem Anforderungsprotokoll vergleichen.
quelle