webentwicklung-frage-antwort-db.com.de

Devise: Warum funktioniert mein Abmelde-Link nicht?

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?

42
jaydel

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.

16
Olives

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 
83
Jay Beale

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.

33
ka8725

Du brauchst beides
link_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'

6
webgen

jQuery ist erforderlich, um die Anforderung mit DELETE auszuführen. Stellen Sie sicher, dass Sie es nicht aus Ihrer application.js gelöscht haben.

4
Christoph

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
4
pws5068

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 
2
RafeekPro

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>
2
Ross Allen

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 

1
user212131

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 %>
1
JorgePinon

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.

1
ScottJShea

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

1
Leonard Kakande

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
0
errata

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).

0
EARnagram

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 .
0
askrynnikov

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
0
Gurudath BN

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.

0
wsizoo