J'ai installé conce sur mon application et appliqué les éléments suivants dans mon fichier application.html.erb
:
<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 exécuté rake routes
et confirmé que tous les itinéraires sont valides.
De plus, dans mon fichier routes.rb
, j'ai devise_for :users
et root :to => "home#index"
.
L'erreur de routage suivante apparaît lorsque je clique sur le lien "Déconnexion":
No route matches "/users/sign_out"
Des idées, qu'est-ce qui cause l'erreur?
Je pense que la procédure de déconnexion est une méthode DELETE
. Cela signifie que votre lien de déconnexion doit ressembler à ceci:
<%= link_to "Sign out", destroy_user_session_path, :method => :delete %>
Le vôtre n'inclut pas la partie :method => :delete
. Notez également que pour que cela fonctionne, vous devez également inclure <%= javascript_include_tag :defaults %>
dans votre fichier de présentation (application.html.erb
).
J'ai changé cette ligne dans invente.rb:
config.sign_out_via = :delete
à
config.sign_out_via = :get
et ça a commencé à fonctionner pour moi.
Vous n'avez probablement pas inclus le fichier javascript jquery_ujs. Assurez-vous que vous utilisez la dernière version de jquery-ujs: https://github.com/Rails/jquery-ujs et les derniers fichiers disponibles:
Rails generate jquery:install
Vous devriez pas avoir plus de fichier Rails.js. Si vous le faites, vous êtes probablement obsolète. Assurez-vous également que ce fichier est chargé avec les valeurs par défaut, dans config/application.rb
config.action_view.javascript_expansions[:defaults] = %w(jquery.min jquery_ujs)
(Encore une fois, vous devriez ne pas avoir le fichier Rails.js ici). Enfin, ajoutez le lien comme documenté sur Devise wiki (haml-style):
= link_to('Logout', destroy_user_session_path, :method => 'delete')
Et tout ira bien.
La possibilité de transformer le lien de déconnexion en 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)
.
Toutefois, si vous n'avez pas installé le gem jquery-ujs
ou n'appelez pas le code javascript obtenu dans votre application.html via = javascript_include_tag "application"
, la réponse sera envoyée sous forme de requête GET et la route échouera.
Vous avez quelques options si vous ne voulez pas utiliser jquery-ujs
ou ne trouvez pas le moyen de le faire fonctionner:
config.sign_out_via
par :get
dans devise.rb
(non recommandé, car DELETE est la requête RESTful appropriée).link_to
en = button_to('Logout', destroy_user_session_path, :method => :delete)
. Avec button_to
Rails fera le gros du travail pour passer le bon appel DELETE. Vous pouvez ensuite styler le bouton pour qu'il ressemble à un lien si vous le souhaitez.Essayez d’ajouter un nouvel itinéraire pour concevoir/sessions # détruire et créer un lien vers celui-ci. Par exemple:
routes.rb
devise_for :users do
get 'logout' => 'devise/sessions#destroy'
end
vue:
<%= link_to "Logout", logout_path %>
J'ai eu le même problème avec Rails 3.1.0 et j'ai résolu d'ajouter les fichiers suivants:
app/assets/javascripts/application.js
//= require_tree
//= require jquery
//= require jquery_ujs
Utilisez-le dans votre fichier routes.rb:
devise_for :users do
get '/users/sign_out' => 'devise/sessions#destroy'
end
À une exception près, la réponse de Jessie a fonctionné pour moi:
<%= link_to "Sign out", destroy_user_session_path, :method => :delete %>
changement:
:delete
... à:
'delete'
Donc le code qui a fonctionné pour moi est:
<%= link_to "Sign out", destroy_user_session_path, :method => 'delete' %>
Beaucoup de réponses à la question déjà. Pour moi, le problème était double:
quand j'étend mes routes:
devise_for :users do
get '/users/sign_out' => 'devise/sessions#destroy'
end
Je devais m'avertir que cela est amorti, je l'ai donc remplacé par:
devise_scope :users do
get '/users/sign_out' => 'devise/sessions#destroy'
end
Je pensais que je vais retirer mon jQuery. Mauvais choix. Devise utilise jQuery pour "simuler" la requête DELETE et l'envoyer en tant que GET. Par conséquent, vous devez:
//= require jquery
//= require jquery_ujs
et bien sûr le même lien que plusieurs mentionnés précédemment:
<%= link_to "Sign out", destroy_user_session_path, :method => :delete %>
Ajouter:
<%= csrf_meta_tag %> and
<%= javascript_include_tag :defaults %> to layouts
Utilisez ces balises link_to
link_to 'Sign out', destroy_user_session_path, :method => :delete
or
link_to 'Sign out', '/users/sign_out', :method => :delete
Dans les itinéraires, ajoutez:
devise_for :users do
get '/users/sign_out' => 'devise/sessions#destroy'
end
Une autre option consiste à configurer la déconnexion pour qu’elle soit GET au lieu de DELETE, vous pouvez le faire en ajoutant la ligne suivante sur /config/initializers/devise.rb
config.sign_out_via = :get
Mais comme l'a écrit Steve Klabnik 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 à cause de la sémantique de cette méthode.
Si vous utilisez Rails 3.1, assurez-vous que votre déconnexion d’application.html.erb ressemble à ceci:
<%= link_to "Sign out", destroy_user_session_path, :method => :delete %>
Et que votre ligne d'inclusion javascript ressemble à la suivante
<%= javascript_include_tag 'application' %>
Je suppose que certaines pierres précieuses écrasent la nouvelle structure de l'emplacement default.js.
Eh bien, les gars pour moi, c'était seulement supprimer la: méthode =>: supprimer
<%= link_to('Sign out', destroy_user_session_path) %>
Je veux ajouter à cela même si c'est un peu vieux.
le lien "sign_out" ne fonctionnait pas malgré le fait que: method =>: delete.
Le commentaire indiquant que <%= javascript_include_tag :defaults %>
doit être inclus m'a rappelé que j'avais récemment ajouté le script JQuery Java et utilisé de simples balises <script src=""/>
pour les inclure.
Quand je les ai déplacés après les valeurs par défaut, le signe_out a recommencé à fonctionner.
Espérons que cela aide quelqu'un.
N'oubliez pas d'inclure la ligne suivante dans votre application.js (Rails 3)
//= require_self
//= require jquery
//= require jquery_ujs
Incluez jquery_ujs
dans mon application Rails et cela fonctionne maintenant.
Cela signifie que vous n'avez pas généré les fichiers jquery après avoir installé le gem jquery-Rails. Donc, vous devez d’abord le générer.
Rails generate devise:install
Première option:
Cela signifie soit que vous devez modifier la ligne suivante sur /config/initializers/devise.rb
config.sign_out_via =: supprimer pour config.sign_out_via =: obtenir
Deuxième option:
Vous ne changez que cette ligne <%= link_to "Sign out", destroy_user_session_path %>
en <%= link_to "Sign out", destroy_user_session_path, :method => :delete %>
sur le fichier de vue.
Généralement, :method => :delete
n'est pas écrit par défaut.
La plupart des réponses sont partielles. J'ai frappé cette question à plusieurs reprises. Deux choses doivent être abordées:
<%= link_to(t('logout'), destroy_user_session_path, :method => :delete) %>
la méthode de suppression doit être spécifiée
Puis, utilise jquery, il faut donc les charger.
<%= javascript_include_tag "myDirectiveJSfile" %>
et assurez-vous que les deux jquery et jquery-ujs sont spécifiés dans votre myDirectiveJSfile.js
//= require jquery
//= require jquery_ujs
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)
Si vous utilisez HTTPS avec carte , le lien sera rompu si votre lien de déconnexion est vers la version non sécurisée. Sur le back-end, 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 que vous utilisez l'aide d'URL et non l'aide de chemin).
<%= link_to "Sign out", destroy_user_session_url(protocol: "https"), method: :delete %>
devise_for :users
devise_scope :user do
get '/users/sign_out' => 'devise/sessions#destroy'
end
Il y a beaucoup de solutions. mais utilisez surtout ceci,
<%= link_to 'Sign out', destroy_user_session_path, method: :delete %>
ou config legs.rb avec la méthode de connexion appropriée
Dans devise.rb
config.sign_out_via = :delete ( or :get which u like to use.)
utilisez la méthode :get
et :delete
pour votre chemin:
devise_scope :user do
match '/users/sign_out' => 'devise/sessions#destroy', :as => :destroy_user_session, via: [:get, :delete]
end
Le problème commence par Rails 3.1 ... dans /app/assets/javascript/
il suffit de chercher application.js.
Si le fichier n'existe pas, créez un fichier portant ce nom. Je ne sais pas pourquoi mon fichier a disparu ou n'a jamais été créé sur "Rails new app"...
.
Ce fichier est l'instance de jquery...
.
Voici ce que j'ai fait (avec Rails 3.0 et Devise 1.4.2):
Dans vos 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
et dans votre application.html.erb:
<%if user_signed_in?%>
<li><%= link_to "Sign_out", sign_out_path %></li>
<% end %>
Vérifiez si votre route.rb a une "ressource: utilisateurs" avant un "devise_pour: utilisateurs", puis essayez de les échanger:
Travaux
Échoue
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é expliquer comment je l'ai corrigé pour ceux qui rencontrent ce problème avec cette version. Votre kilométrage peut varier, mais voici ce qui a fonctionné pour moi.
Tout d’abord, assurez-vous d’avoir installé les pierres précieuses et exécutez l’installation groupée.
gem 'jquery-Rails'
gem 'turbolinks'
gem 'jquery-turbolinks'
Dans application.js, vérifiez que tout est requis comme ci-dessous.
Faites attention si ceci vous arrive: c'est //= require jquery.turbolinks
et non //= require jquery-turbolinks
//= require jquery
//= require jquery_ujs
//= require jquery.turbolinks
//= require turbolinks
//= require_tree .
Ensuite, ajoutez les liens appropriés dans l'en-tête de application.html.erb.
<%= javascript_include_tag "application", "data-turbolinks-track" => true %>
<%= javascript_include_tag :defaults %>
Il semble y avoir beaucoup de variations sur la manière d'implémenter la méthode delete, ce qui dépend de la version de Rails que vous utilisez. C'est la syntaxe delete
que j'ai utilisée.
<p><%= link_to "Sign Out", destroy_user_session_path, :method => 'delete' %></p>
J'espère que ça aidera Diguer quelqu'un de ce trou très frustrant!
le ':method => :delete
'dans la page est' data-method="delete"
'', votre page doit donc avoir jquery_ujs.js, elle soumettra un lien avec la méthode delete, not method, get
En général, lorsque vous obtenez "Pas de correspondance d'itinéraire" mais que vous pensez que vous avez défini cette route alors vérifiez bien la méthode http verb/request (que ce soit obtenir, mettre, poster, supprimer, etc.) pour cette route .
Si vous exécutez des routes de rake, vous verrez alors la méthode attendue et vous pourrez la comparer au journal des demandes.