web-dev-qa-db-fra.com

Aucune route ne correspond à "/ utilisateurs / sign_out" inventer Rails 3

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?

384
vich

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

564
Jessie Dedecker

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.

132
kitdesai

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.

60
Gravis

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:

  1. Remplacez config.sign_out_via par :get dans devise.rb (non recommandé, car DELETE est la requête RESTful appropriée).
  2. OU Modifiez le 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.
31
Will Nathan

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 %>
24
Kevin Tsoi

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
13
gringo

Utilisez-le dans votre fichier routes.rb:

devise_for :users do
    get '/users/sign_out' => 'devise/sessions#destroy'
end
13
Uma Maheswararao

À 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
Galen

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

  1. quand j'étend mes routes:

    devise_for :users do 
       get '/users/sign_out' => 'devise/sessions#destroy'
    end
    
  2. 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
    
  3. 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
    
  4. 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 %>
    
9
Lukasz Muzyka

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
7
Amal Kumar S

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.

7
Rodrigo Flores

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.

6
StlTenny

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

<%= link_to('Sign out', destroy_user_session_path) %>
5
workdreamer

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.

5
Greg

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.

5
The Lazy Log

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.

5
Deepak Lamichhane

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
5
Jerome

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 méthode HTTP par défaut utilisée pour déconnecter une ressource. La valeur par défaut est: get. 188
  • # config.sign_out_via =: obtenez 187
  • # La méthode HTTP par défaut utilisée pour déconnecter une ressource. La valeur par défaut est: delete. 188
  • config.sign_out_via =: supprimer
5
Shane

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 %>
4
Tyler Collier
  devise_for :users
  devise_scope :user do
    get '/users/sign_out' => 'devise/sessions#destroy'
  end
4
dipole_moment

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.) 
3
jon snow

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
3
Zakaria

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

3
rome3ro

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

  1. Assurez-vous que votre page charge Rails.js
  2. Utilisez ce paramètre: 'data-method' => 'delete'
  3. Bonne idée d'ajouter ce paramètre:: rel => 'nofollow'
2
Larry

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 %>
2
Matz Heri

Vérifiez si votre route.rb a une "ressource: utilisateurs" avant un "devise_pour: utilisateurs", puis essayez de les échanger:

  1. Travaux

    • devise_pour: utilisateurs
    • ressources: utilisateurs
  2. Échoue

    • ressources: utilisateurs
    • devise_pour: utilisateurs
1
Charles Magid

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!

1
mikeym

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

1
user1599712

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.

0
Muntasim