das Problem: Wenn ich versuche, einen Abmelde-Link zu meiner App zu installieren, funktioniert dies nicht. Hier ist so viel Kontext, wie ich mir vorstellen kann (wenn Sie etwas anderes wollen, stecken Sie mich bitte) ...
Ich habe das aus einer haml-sicht:
= link_to("Logout", destroy_user_session_path, :method => :delete)
Es erzeugt dies in der Ansicht:
<a href="/users/sign_out" data-method="delete" rel="nofollow">Logout</a>
Ich habe bestätigt, dass ich diese Einstellung in meiner config/initializers/devise.rb unkommentiert und korrekt habe:
config.sign_out_via = :delete
Ich habe die folgende Route bestätigt:
destroy_user_session DELETE /users/sign_out(.:format) {:action=>"destroy", :controller=>"devise/sessions"}
Ich habe auch diese Trickserei in meinen routen.rb, und ich vermute, dass dies mit meinem Problem zusammenhängt:
devise_for :users, :controllers => {:sessions => "devise/sessions", :registrations => "users"}
resources :users
Das letzte Bit ist, weil ich Benutzer in meinem eigenen Controller verwalten (bearbeiten, erstellen und löschen) möchte.
Die Fehlermeldung, die ich bekomme, lautet wie folgt:
ActiveRecord::RecordNotFound in UsersController#show
Couldn't find User with ID=sign_out
Rails.root: /home/jaydel/projects/mbsquared-projects/Wilson-Goldrick
app/controllers/users_controller.rb:16:in `show'
In meinen Serverprotokollen sehe ich Folgendes für die Anfrage:
Started GET "/users/sign_out" for 127.0.0.1 at 2011-08-04 13:08:51 -0500
Processing by UsersController#show as HTML
Parameters: {"id"=>"sign_out"}
Hat jemand Ideen?
Das Problem liegt in der Tatsache, dass in Ihren Protokollen die Abmeldeanforderung eine GET-Anforderung ist.
Started GET "/users/sign_out"
Die Abmelde-Route ist jedoch LÖSCHEN
destroy_user_session DELETE /users/sign_out(.:format)
Der Grund, warum Sie die Ausnahme erhalten, ist, dass sie mit einer der von resources :users
erstellten Routen verwirrt wird, was in etwa der Fall wäre
edit_user GET /users/(:id)(.:format) {:action=>"edit", :controller=>"users"}
Im Grunde wird "sign_out" als id verwechselt.
Ich bin nicht sicher, warum der Lösch-Link nicht als DELETE-Anfrage durchläuft. Obwohl sich ändern
config.sign_out_via = :delete
:get
zu sein, könnte das Problem lösen.
REST-weise können Sie dies beheben, indem Sie die Abmeldelinks so ändern, dass die Methode DELETE verwendet wird. Es ist eine sehr einfache Lösung, dies zu ändern:
link_to "Log out", destroy_user_session_path
zu diesem:
link_to "Log out", destroy_user_session_path, :method => :delete
Ich hatte das gleiche Problem mit Rails 3.2, als ich diese Zeile aus application.js
löschte:
//= require jquery_ujs
Ich denke, Sie müssen diese Zeile in Ihren application.js
einfügen, wenn Sie es nicht dort haben.
PS. Dieses Verhalten bedeutet, dass der Rails-Adapter für jquery
nicht funktioniert. Sie sollten also sicherstellen, dass es in Ihrem HTML-Browser im Browser geladen ist. Sie sollten es im Entwicklungsmodus testen, da Sie js in der Produktion komprimiert haben und es sehr schwierig sein wird, dort etwas zu finden.
Du brauchst beideslink_to "Log out", destroy_user_session_path, method: :delete
&& diese in application.js enthalten
//= require jquery
//= require jquery_ujs
. Vergiss nicht, dies zu Gemfile hinzuzufügen, wenn es aus irgendeinem Grund nicht da ist.
gem 'jquery-Rails'
jQuery ist erforderlich, um die Anforderung mit DELETE auszuführen. Stellen Sie sicher, dass Sie es nicht aus Ihrer application.js gelöscht haben.
Dies ist eine alte Frage, aber die akzeptierte Antwort ist nicht der richtige Weg, um dieses Problem zu lösen (obwohl es eine gute Diagnose des Problems ist).
Als ich heute darauf stieß, erschien meine Routendatei als:
root :to => 'welcome#index'
resources :users
devise_for :users
Wie von Olives erwähnt, führt die Ressourcen-Anweisung einfach dazu, dass/users/irgendetwas stürzt. Ich musste einfach die Reihenfolge meiner Routen umkehren ...
root :to => 'welcome#index'
devise_for :users
resources :users
Ich habe alle diese Lösungen geprüft, aber niemand hat für mich gearbeitet. Schließlich fand ich, dass ich im Header zwei Zeilen gelöscht habe, einschließlich Anwendungs-Tags und Csrf-Meta
Wenn also an diesem Punkt jemand dieses Problem ohne Entschuldigung hat - prüfen Sie, ob Sie im Kopf der Seite (HAML-Notation) sind.
= javascript_include_tag 'application'
= csrf_meta_tags
Dies ist eine alte Frage, aber ich wollte einen Weg, der kein JavaScript erfordert. Rails aktiviert "DELETE" -Anforderungen mit einer versteckten Eingabe, die method
auf delete
setzt. Verwenden Sie einen echten <form>
und lassen Sie Rails die notwendigen versteckten Eingaben generieren:
<%= form_for(resource, as: resource_name,
url: destroy_user_session_path, html: { method: :delete }) do |f| %>
<%= f.submit "Log out" %>
<% end %>
das oben genannte erzeugt so etwas wie:
<form accept-charset="UTF-8" action="/users/sign_out" method="post">
<div style="display:none">
<input name="utf8" type="hidden" value="✓">
<input name="_method" type="hidden" value="delete">
<input name="authenticity_token" type="hidden" value="1234">
</div>
<input name="commit" type="submit" value="Log out">
</form>
Sie müssen auch überprüfen, ist resources :users
unter devise_for :users
und ist die Linkmethode löschen
link_to "Logout", destroy_user_session_path, method: :delete
wenn beides richtig ist, sollte die Schaltfläche zum Abmelden funktionieren
Da das erwähnte OP-Gerät und dieses Problem auch bei mir vorgekommen ist, wollte ich einfach reiten. @ Ross Allen hatte die richtige Antwort, wenn Sie nicht jQuery_ujs verwenden möchten. Rails stellt einige Helfer zur Verfügung, um dies ohne jQuery zu lösen.
Dies ist die Antwort von Ross, jedoch unter Verwendung des Devise-Modells current_user:
<%= form_for(current_user,
url: destroy_user_session_path, html: { method: :delete }) do |f| %>
<%= f.submit "Log out" %>
<% end %>
Oder das knappere button_to helper, das ein ähnliches Formular erstellt:
<%= button_to "Log out", destroy_user_session_path, method: :delete %>
Ich musste das anders angehen als meine Anwendung.
<%= link_to "Sign out", destroy_user_session_path, :method => :delete %>
und versagte immer noch. Es stellte sich heraus, dass ich config.serve_static_assets = true
in/environment/development, test und production.rb einstellen musste. Dieser Link hat mir geholfen, es herauszufinden.
Wenn Sie in Ihrer Rails-App auch mehrere Jquery-Quellen haben, müssen Sie die in der Gemfile angegebene Standardquelle verwenden
stellen Sie sicher, dass Sie dies in Ihrem Gemfile haben
gem 'jquery-Rails'
in Ihren Assets haben Sie keine anderen JQuery-Quelldateien.
in meinem Fall hatte ich eine zweite JQuery-Datei, die nicht die Standardeinstellung war, wie in der Gemfile-Datei angegeben, sodass Konflikte verursacht wurden.
wenn Sie diese Quellen zuvor hatten, müssen Sie die Assets erneut vorkompilieren, wenn Sie dies zuvor getan haben
Ich stimme zu, dass die Verwendung der http DELETE-Methode ruhiger ist. Ich möchte gerne einen einfachen Endpunkt erstellen, um eine Benutzersitzung mit einer GET-Methode zu löschen.
indem Sie dies zu config/routes.rb hinzufügen
devise_scope :user do
get '/logout', :to => 'sessions#destroy'
end
Wenn Sie dieses Problem in der Produktion feststellen und die Asset-Pipeline verwenden, müssen Sie häufig:
rake assets:clobber
, um Ihre öffentlichen Vermögenswerte zu löschen. Dann rake assets:precompile
vor dem Festschreiben und Weitergeben Ihres Codes (es sei denn, Ihr Push führt auch Vorkompilierungen durch, auch bekannt als Heroku).
der Grund kann in der falschen Reihenfolge der Verbindung liegen. bootstrap-sprockets
die richtige Reihenfolge:
// app/assets/javascripts/application.js
...
//= require jquery
//= require jquery_ujs
//= require turbolinks
//= require bootstrap-sprockets
//= require_tree .
1) Ich habe das Gefühl, dass Sie möglicherweise unter gem installiert werden müssen, die Anfrage mit der Methode:: delete funktioniert, sonst kann es als get gehen
https://github.com/Rails/jquery-Rails
2) Fügen Sie diese beiden Zeilen in application.js ein
//= require jquery
//= require jquery_ujs
Wie von Tombart oben erwähnt, war die Antwort für mich, den Rails-ujs-Aufruf in meiner application.js-Datei zurückzusetzen.
//= require Rails-ujs
//= require turbolinks
Ich hatte sie zunächst entfernt, um zu verhindern, dass meine Skripte in der Fußzeile fehlerhaft ausgewertet wurden. Mein Workaround bestand darin, eine footer.js-Kompilierungsdatei mit den gewünschten Ressourcen in der Fußzeile zu erstellen.
//= require jquery-3.2.1.min
//= require jquery-ui-1.12.1.min
//= require materialize
//= require init
Dann fügen Sie in meiner /initializers/assets.rb -Datei eine Vorkompilierung hinzu
Rails.application.config.assets.precompile += %w( footer.js )
Dann können Sie Folgendes in Ihrer Datei layout/application.html.erb aufrufen.
<%= javascript_include_tag 'application', 'data-turbolinks-track' => true %>
<%= javascript_include_tag 'footer' %>
Ich behalte die Anwendungszeile in der Kopfzeile und füge vor dem Ende meines Body-Tags meinen neuen "footer" -Aufruf hinzu.