J'ai installé devise sur mon application et appliqué les éléments suivants dans mon application.html.erb
fichier:
<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>
J'ai couru rake routes
et confirmé que tous les itinéraires sont valides.
Aussi, dans mon routes.rb
dossier, j'ai devise_for :users
et root :to => "home#index"
.
J'obtiens l'erreur de routage suivante en cliquant sur le lien "Déconnexion":
No route matches "/users/sign_out"
Des idées qui sont à l'origine de l'erreur?
gem 'devise', :git => 'git://github.com/plataformatec/devise.git'
. Mais cela n'a rien fait.Réponses:
Je pense que l'itinéraire pour se déconnecter est une
DELETE
méthode. Cela signifie que votre lien de déconnexion doit ressembler à ceci:Le vôtre n'inclut pas la
:method => :delete
partie. Veuillez également noter que pour que cela fonctionne, vous devez également inclure<%= javascript_include_tag :defaults %>
votre fichier de mise en page (application.html.erb
).la source
link_to "Sign out", destroy_user_session_path
a toujours été assez bon pour moi.$("<a href='/users/sign_out' data-method='delete'>Sign out</a>").appendTo('body');
- si jQuery est chargé sur la page.J'ai changé cette ligne dans devise.rb:
à
et ça a commencé à marcher pour moi.
la source
config.sign_out_via = [ :post, :delete ]
oudevise_for :users, :sign_out_via => [ :post, :delete ]
, comme décrit dans devise / rails / routes.rb .Vous n'avez probablement pas inclus de fichier javery_ujs javascript. Assurez-vous que vous utilisez la dernière version de jquery-ujs: https://github.com/rails/jquery-ujs et les derniers fichiers disponibles:
Vous ne devriez plus avoir de fichier rails.js. Si vous le faites, vous êtes probablement obsolète. Assurez-vous également que ce fichier est chargé avec des valeurs par défaut, dans config / application.rb
(Encore une fois, vous ne devriez pas avoir de fichier rails.js ici). Enfin, ajoutez le lien tel que documenté sur Devise wiki (style haml):
Et tout ira bien.
la source
javascript_include_tag "jquery_ujs"
application.js
. Mauvaise supposition, je suppose. Merci.La possibilité de faire du lien de déconnexion un appel DELETE RESTful nécessite un attribut html
data-method = "delete"
en utilisant le code rails= link_to('Logout', destroy_user_session_path, :method => :delete)
.Cependant, si vous n'avez pas
jquery-ujs
installé la gemme ou n'appelez pas le javascript résultant dans votre application.html via= javascript_include_tag "application"
, la réponse sera envoyée sous forme de demande GET et l'itinéraire échouera.Vous avez quelques options si vous ne souhaitez pas utiliser
jquery-ujs
ou ne pouvez pas trouver un moyen de le faire fonctionner:config.sign_out_via
en égal à l':get
intérieurdevise.rb
(non recommandé, car SUPPRIMER est la requête RESTful appropriée)link_to
pour= button_to('Logout', destroy_user_session_path, :method => :delete)
. Avecbutton_to
Rails fera le gros du travail en effectuant l'appel DELETE approprié. Vous pouvez ensuite styliser le bouton pour qu'il ressemble à un lien si vous le souhaitez.la source
button_to
, Rails génère unform
pour toute l'action. C'est pourquoi il est possible d'utiliser la:delete
méthode avecbutton_to
et non aveclink_to
, il suffit de voir le code HTML généré.Essayez d'ajouter une nouvelle route pour concevoir / sessions # destroy et de créer un lien vers cela. Par exemple:
vue:
la source
link_to
appel, comme décrit dans l'autre réponse.Utilisez-le dans votre fichier routes.rb:
la source
J'ai eu le même problème avec les rails 3.1.0, et j'ai résolu d'ajouter au fichier les lignes suivantes:
la source
À une exception près, la réponse de Jessie a fonctionné pour moi:
changement:
... à:
Donc, le code qui a fonctionné pour moi est:
la source
Beaucoup de réponses à la question déjà. Pour moi, le problème était double:
lorsque j'élargis mes itinéraires:
Je recevais un avertissement indiquant que ce montant est amorti, je l'ai donc remplacé par:
Je pensais que je supprimerais ma jQuery. Mauvais choix. Devise utilise jQuery pour "falsifier" la demande DELETE et l'envoyer en tant que GET. Vous devez donc:
et bien sûr le même lien que beaucoup mentionné précédemment:
la source
Ajouter:
Utilisez ces balises link_to
Dans les itinéraires, ajoutez:
la source
Une autre option consiste à configurer la déconnexion pour être un GET au lieu d'un DELETE, vous pouvez le faire en ajoutant la ligne suivante sur
/config/initializers/devise.rb
Mais comme Steve Klabnik l'a écrit sur son blog (http://blog.steveklabnik.com/2011/12/11/devise-actioncontroller-routingerror-no-route-matches-get-slash-users-slash-sign-out.html ) essayez d'utiliser DELETE en raison de la sémantique de cette méthode.
la source
Si vous utilisez Rails 3.1, assurez-vous que votre déconnexion application.html.erb ressemble à:
<%= link_to "Sign out", destroy_user_session_path, :method => :delete %>
Et que votre ligne d'inclusion javascript ressemble à ce qui suit
<%= javascript_include_tag 'application' %>
Je suppose que certaines gemmes écrasent la nouvelle structure de l'emplacement default.js.
la source
Vérifiez-le avec le code source dans github:
https://github.com/plataformatec/devise/commit/adb127bb3e3b334cba903db2c21710e8c41c2b40#lib/generators/templates/devise.rb (date: 27 juin 2011)
la source
Eh bien, les gars pour moi, c'était seulement supprimer la: méthode =>: supprimer
la source
Cela signifie que vous n'avez pas généré les fichiers jquery après avoir installé la gemme jquery-rails. Vous devez donc d'abord le générer.
rails generate devise:install
Première option:
Cela signifie que vous devez modifier la ligne suivante sur
/config/initializers/devise.rb
config.sign_out_via =: supprimer vers config.sign_out_via =: obtenir
Deuxième option:
Vous modifiez cette ligne
<%= link_to "Sign out", destroy_user_session_path %>
pour<%= link_to "Sign out", destroy_user_session_path, :method => :delete %>
le fichier de vue.N'est généralement
:method => :delete
pas écrit par défaut.la source
Je veux ajouter à cela même si c'est un peu vieux.
le lien "sign_out" n'a pas fonctionné, malgré le fait que: method =>: delete.
Le commentaire indiquant que cela
<%= javascript_include_tag :defaults %>
doit être inclus m'a rappelé que j'avais récemment ajouté le script java JQuery et utilisé des<script src=""/>
balises simples pour les inclure.Lorsque je les ai déplacés de après: par défaut vers avant, le signe_out a recommencé à fonctionner.
J'espère que cela aide quelqu'un.
la source
La plupart des réponses sont partielles. J'ai rencontré ce problème à plusieurs reprises. Deux choses doivent être abordées:
la méthode de suppression doit être spécifiée
Puis imaginez utilise jquery, vous devez donc les charger
et assurez-vous que les DEUX jquery et jquery-ujs sont spécifiés dans votre myDirectiveJSfile.js
la source
N'oubliez pas d'inclure la ligne suivante dans votre application.js (Rails 3)
Inclure
jquery_ujs
dans mon application rails et ça marche maintenant.la source
Si vous utilisez HTTPS avec devise , il se brisera si votre lien de déconnexion est vers la version non sécurisée. À l'arrière, il redirige vers la version sécurisée. Cette redirection est un GET, ce qui provoque le problème.
Assurez-vous que votre lien utilise HTTPS. Vous pouvez le forcer avec
protocol: "https"
dans votre assistant d'URL (assurez-vous d'utiliser l'aide d'URL et non l'aide de chemin).la source
la source
Le problème commence avec les rails 3.1 ...
/app/assets/javascript/
recherchez simplement application.js.Si le fichier n'existe pas, créez un fichier avec ce nom, je ne sais pas pourquoi mon fichier disparaît ou n'a jamais été créé
"rails new app"...
.Ce fichier est l'instance de
jquery...
.la source
Beaucoup de solutions sont là. mais surtout l'utiliser,
ou config devise.rb avec la bonne méthode sign_out
Dans devise.rb
la source
utilisation
:get
et:delete
méthode pour votre chemin:la source
Dans vos routes.rb:
et dans votre application.html.erb:
la source
C'est ce que j'ai fait (avec Rails 3.0 et Devise 1.4.2):
la source
Vérifiez si votre routes.rb a une "ressource: utilisateurs" avant un "devise_for: utilisateurs" puis essayez de les échanger:
Travaux
Échoue
la source
la
':method => :delete
« de la page est »data-method="delete"
' de sorte que votre page doit avoir jquery_ujs.js, il présentera lien avec la méthode méthode supprime pas getla source
Je sais que c'est une vieille question basée sur Rails 3 mais je viens de la rencontrer et de la résoudre sur Rails 4.0.4. Alors j'ai pensé que je pourrais expliquer comment je l'ai corrigé pour toute personne rencontrant ce problème avec cette version. Votre kilométrage peut varier, mais voici ce qui a fonctionné pour moi.
Assurez-vous d'abord que les gemmes sont installées et exécutez l'installation de l'ensemble.
Dans application.js, vérifiez que tout est requis comme ci-dessous.
Méfiez-vous si ce problème : c'est
//= require jquery.turbolinks
et non//= require jquery-turbolinks
Ensuite, ajoutez les liens appropriés dans l'en-tête de application.html.erb.
Il semble y avoir de nombreuses variantes sur la façon d'implémenter la méthode de suppression qui, je suppose, dépend de la version de Rails que vous utilisez. C'est la
delete
syntaxe que j'ai utilisée.J'espère que cela aidera quelqu'un à sortir de ce trou très frustrant!
la source
En général, lorsque vous obtenez "Aucune correspondance de route" mais que vous pensez avoir défini cette route, revérifiez la méthode du verbe / demande http (que ce soit pour obtenir, mettre, publier, supprimer, etc.) pour cette route .
Si vous exécutez des itinéraires de râteau, vous verrez la méthode attendue et vous pouvez la comparer avec le journal des demandes.
la source