Pas de correspondance "/ utilisateurs / sortie"

j'ai installé devise sur mon application et appliqué ce qui suit 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 couru rake routes et a confirmé que toutes les routes sont valides.

aussi, dans mon fichier routes.rb j'ai devise_for :users et root :to => "home#index" .

j'obtiens l'erreur de routage suivante en cliquant sur le lien" Sign out":

No route matches "/users/sign_out"

une idée de la cause de l'erreur?

379
demandé sur vich 2011-07-02 17:31:15

29 réponses

je pense que l'itinéraire pour la sortie est une méthode DELETE . Cela signifie que votre lien déconnexion doit ressembler à ceci:

<%= link_to "Sign out", destroy_user_session_path, :method => :delete %>

la vôtre n'inclut pas la partie :method => :delete . Aussi, veuillez noter que pour que cela fonctionne, vous devez également inclure <%= javascript_include_tag :defaults %> dans votre fichier de mise en page ( application.html.erb ).

559
répondu Jessie Dedecker 2015-12-12 04:19:06

j'ai changé cette ligne dans devise.rb:

config.sign_out_via = :delete

à

config.sign_out_via = :get

et ça a commencé à marcher pour moi.

130
répondu kitdesai 2011-07-12 04:31:26

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 ont plus de rails.fichier js. Si vous le faites, vous êtes probablement out-of-date. Assurez-vous également que ce fichier est chargé par défaut, dans config/application.rb

config.action_view.javascript_expansions[:defaults] = %w(jquery.min jquery_ujs)

(à nouveau, vous devriez pas avoir des rails.fichier js ici). Enfin, ajouter le lien tel que documenté sur Wiki de Devise (style haml):

= link_to('Logout', destroy_user_session_path, :method => 'delete')

Et tout ira bien.

58
répondu Gravis 2014-06-23 13:38:44

la possibilité de faire du lien de déconnexion un appel de suppression RESTful nécessite un attribut html data-method = "delete" en utilisant le code de rails = link_to('Logout', destroy_user_session_path, :method => :delete) .

cependant, si vous n'avez pas le gem jquery-ujs installé ou n'appelez pas le JavaScript résultant dans votre application.html via = javascript_include_tag "application" , la réponse sera envoyée comme une demande GET, et la route échouera.

vous avez quelques options si vous ne voulez pas utiliser jquery-ujs ou ne peut pas trouver un moyen de le faire fonctionner:

  1. Changement config.sign_out_via à égalité :get à l'intérieur devise.rb (pas recommandée, car SUPPRIMER est approprié Reposant requête)
  2. ou remplacer link_to par = button_to('Logout', destroy_user_session_path, :method => :delete) . Avec button_to Rails fera le levage lourd sur la réalisation de L'appel de suppression appropriée. Vous pouvez alors styliser le bouton pour ressembler à un lien si vous le souhaitez.
31
répondu Will Nathan 2012-09-30 20:11:50

essayez d'ajouter une nouvelle route à la devise/sessions#destroy et le lien à cela. Par exemple:

routes.rb
devise_for :users do
  get 'logout' => 'devise/sessions#destroy'
end

:

<%= link_to "Logout", logout_path %>
24
répondu Kevin Tsoi 2011-11-12 20:43:48

j'ai eu le même problème avec les rails 3.1.0, et j'ai résolu en ajoutant dans le fichier les lignes suivantes:

app/assets/javascripts/application.js
//= require_tree
//= require jquery
//= require jquery_ujs
13
répondu gringo 2011-09-01 22:27:39

utilisez-le sur vos itinéraires.dossier rb:

devise_for :users do
    get '/users/sign_out' => 'devise/sessions#destroy'
end
13
répondu Uma Maheswararao 2012-03-30 08:38:59

à 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' %>
10
répondu Galen 2011-07-14 04:43:09

plusieurs réponses à la question déjà. Pour moi, le problème était double:

  1. quand je développer mes itinéraires:

    devise_for :users do 
       get '/users/sign_out' => 'devise/sessions#destroy'
    end
    
  2. je recevais un avertissement que ceci est déprécié donc je l'ai remplacé par:

    devise_scope :users do
       get '/users/sign_out' => 'devise/sessions#destroy'
    end
    
  3. j'ai pensé que je vais enlever mon jQuery. Mauvais choix. Devise utilise jQuery pour" faux " supprimer la demande et l'envoyer comme GET. Par conséquent, vous devez:

    //= require jquery
    //= require jquery_ujs
    
  4. et bien sûr le même lien que beaucoup ont mentionné avant:

    <%= link_to "Sign out", destroy_user_session_path, :method => :delete %>
    
8
répondu Lukasz Muzyka 2013-03-22 14:10:05

ajouter:

  <%= csrf_meta_tag %>  and 
  <%= javascript_include_tag :defaults %>  to layouts

utilisez ces tags link_to

 link_to 'Sign out', destroy_user_session_path, :method => :delete

  or

 link_to 'Sign out', '/users/sign_out', :method => :delete

dans routes ajouter:

  devise_for :users do
    get '/users/sign_out' => 'devise/sessions#destroy'
  end
7
répondu Amal Kumar S 2011-11-18 11:54:26

L'autre option est de configurer la déconnexion pour être un GET à la place D'un DELETE, vous pouvez faire que l'ajout de 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.

7
répondu Rodrigo Flores 2011-12-17 20:32:58

si vous utilisez les Rails 3.1 assurez-vous que votre application.HTML.on dirait:

<%= link_to "Sign out", destroy_user_session_path, :method => :delete %>

et que votre ligne JavaScript include ressemble à la suivante

<%= javascript_include_tag 'application' %>

à mon avis, certaines gemmes écrasent la nouvelle structure de la valeur par défaut.js emplacement.

6
répondu StlTenny 2012-01-06 02:42:11

Check it out avec le code source sur github:

https://github.com/plataformatec/devise/commit/adb127bb3e3b334cba903db2c21710e8c41c2b40#lib/generators/templates/devise.rb (date: 27 juin 2011)

  • # la méthode HTTP par défaut utilisée pour signer une ressource. Par défaut est:. 188
  • # config.sign_out_via = :obtenir 187
  • # la méthode HTTP par défaut utilisée pour signez une ressource. Par défaut est :supprimer. 188
  • config.sign_out_via =: supprimer
5
répondu Shane 2011-07-16 17:12:46

Eh bien, les gars pour moi, il était seulement supprimer la: méthode =>: supprimer

<%= link_to('Sign out', destroy_user_session_path) %>
5
répondu workdreamer 2011-09-01 20:20:50

Cela signifie que vous n'avez pas généré les fichiers jquery après avoir installé le jquery-gem rails. Alors d'abord vous avez besoin pour l'obtenir.

rails generate devise:install

Première Option:

cela signifie que soit vous devez changer la ligne suivante sur /config/initializers/devise.rb

config.sign_out_via = :supprimer de la configuration.sign_out_via = :obtenir des

Deuxième Option:

Vous n' changez cette ligne <%= link_to "Sign out", destroy_user_session_path %> en <%= link_to "Sign out", destroy_user_session_path, :method => :delete %> dans le fichier view.

habituellement :method => :delete n'est pas écrit par défaut.

5
répondu Deepak Lamichhane 2012-02-20 20:03:41

je veux ajouter à cela, même si c'est un peu vieux.

le lien "sign_out" n'a pas fonctionné, malgré le fait d'avoir :method => :delete.

le commentaire indiquant que <%= javascript_include_tag :defaults %> doit être inclus m'a rappelé que j'avais récemment ajouté jQuery java script et utilisé des balises simples <script src=""/> pour les inclure.

quand je les ai déplacés de :par défaut à before, le sign_out a recommencé à fonctionner.

Espérons que cela aide quelqu'un.

5
répondu Greg 2013-01-22 05:12:27

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.

4
répondu The Lazy Log 2015-11-12 08:26:43

la Plupart des réponses sont partielles. J'ai touché à cette question de nombreuses fois. Deux points doivent être abordés:

<%= link_to(t('logout'), destroy_user_session_path, :method => :delete) %>

la méthode supprimer doit être spécifiée

puis concevoir utilise jquery, donc vous devez charger ces

   <%= javascript_include_tag "myDirectiveJSfile" %> 

et s'assurer que jQuery et jquery-ujs sont spécifiés dans votre myDirectiveJSfile.js

//= require jquery
//= require jquery_ujs
3
répondu Jerome 2014-07-05 08:14:24

si vous utilisez HTTPS avec devise , il se cassera si votre lien de sortie est vers la version non sécurisée. À l'arrière, il redirige vers la version sécurisée. Cette redirection est un GET, qui provoque le problème.

assurez-vous que votre lien utilise HTTPS. Vous pouvez le forcer avec protocol: "https" dans votre helper url (assurez-vous d'utiliser l'helper url et non l'Helper path).

<%= link_to "Sign out", destroy_user_session_url(protocol: "https"), method: :delete %>
3
répondu Tyler Collier 2014-07-23 23:09:51
  devise_for :users
  devise_scope :user do
    get '/users/sign_out' => 'devise/sessions#destroy'
  end
3
répondu dipole_moment 2015-10-12 17:10:53

dans vos itinéraires.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 demande.HTML.erb:

<%if user_signed_in?%>
          <li><%= link_to "Sign_out", sign_out_path %></li>
<% end %>
2
répondu Uladzimir Khadakouski 2012-09-29 10:02:16

C'est ce que j'ai fait (avec Rails 3.0 et Devise 1.4.2):

  1. assurez-vous que votre page charge des rails.js
  2. utilisez ce paramètre: 'data-method' = > 'delete'
  3. bonne idée d'ajouter ce paramètre:: rel = > 'nofollow'
2
répondu Larry 2012-11-13 00:53:44

le ':method => :delete "en page est data-method="delete" " donc votre page doit avoir jquery_ujs.js, il va soumettre le lien avec la méthode Supprimer pas la méthode get

2
répondu user1599712 2013-04-25 07:21:16

le problème commence avec les rails 3.1... dans /app/assets/javascript/ il suffit de regarder pour l'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éé sur "rails new app"... .

ce fichier est l'instance de jquery... .

2
répondu rome3ro 2013-04-25 07:50:24

beaucoup de solutions sont là. mais surtout utilisez ceci,

<%= link_to 'Sign out', destroy_user_session_path, method: :delete %>

ou config concevoir.rb avec une bonne sign_out méthode

dans devise.rb

config.sign_out_via = :delete ( or  :get which u like to use.) 
2
répondu jon snow 2014-03-24 15:12:35

utilisez :get et :delete méthode pour votre chemin:

devise_scope :user do
  match '/users/sign_out' => 'devise/sessions#destroy', :as => :destroy_user_session, via: [:get, :delete]
end
2
répondu Zakaria 2015-03-19 14:53:10

Voir si vos itinéraires.rb a une" ressource :utilisateurs "avant une" devise_for: utilisateurs", puis essayez de les échanger:

  1. Œuvres

    • devise_for :les utilisateurs
    • ressources: utilisateurs
  2. échoue

    • ressources: utilisateurs
    • devise_for :les utilisateurs
1
répondu Charles Magid 2012-05-24 00:20:18

en général lorsque vous obtenez" No route matches "mais que vous pensez avoir cette route définie puis vérifiez la méthode http verb / request (si son get, put, post, delete etc.) pour cette route .

si vous exécutez des routes de râteau alors vous verrez la méthode attendue et vous pouvez comparer cela avec le journal de requêtes.

1
répondu Muntasim 2013-06-09 07:49:19

je sais que c'est une vieille question basée sur les Rails 3 mais j'ai juste couru pour la résoudre sur les Rails 4.0.4. Alors j'ai pensé que je pourrais vous dire comment je l'ai réparé pour quelqu'un 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 lancez bundle install.

gem 'jquery-rails'

gem 'turbolinks'

gem 'jquery-turbolinks'

en application.js vérifiez que tout est requis comme ci-dessous.

attention si ce gotcha : 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 la demande.HTML.Erb.

<%= javascript_include_tag  "application", "data-turbolinks-track" => true %>
<%= javascript_include_tag :defaults %>

il semble y avoir de nombreuses variations sur la façon d'implémenter la méthode delete qui, je suppose, dépend de la version des 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>

l'Espérance qui permet de creuser quelqu'un de ce trou très frustrant!

0
répondu mikeym 2016-02-04 04:55:51