Aucun itinéraire ne correspond [GET] " / utilisateurs / déconnexion"

Voici mon erreur réelle: No route matches [GET] "/members/sign_out" Puisque la plupart des gens vont utiliser les "utilisateurs" j'ai pensé qu'il serait plus utile que dans le titre. En tout cas, je suis essentiel incapable de me déconnecter. Je peux modifier avec succès mon profil de membre.

J'utilise devise 1.4.2 et Rails 3.1.0.rc4. En outre, j'ai généré deux modèles de devise distincts-l'un appelé " membres "et l'autre appelé"admins". J'ai pu m'inscrire et me connecter aux deux (simultanément) en naviguant manuellement vers le bon chemin D'URL (c'est à dire, localhost:3000/admins/sign_in/). J'ai créé quelques liens dans mon application.HTML.fichier de mise en page haml en suivant ce RailsCast sur Devise . Je suis conscient qu'il ne s'adresse qu'aux liens signin / signout pour les "membres"."

Si je clique sur le lien de déconnexion, j'obtiens l'erreur ci-dessus. Cela se produit si je navigue manuellement vers L'une ou l'autre URL de déconnexion (c'est-à-dire, localhost:3000/admins/sign_out/).

Quelqu'un peut-il me dire pourquoi cela se produit? Voici les différents fichiers connexes. Et bien sûr, je suis novice...

Sortie des routes de râteau:

    j(film_repo)$ rake routes
        new_member_session GET    /members/sign_in(.:format)       {:action=>"new", :controller=>"devise/sessions"}
            member_session POST   /members/sign_in(.:format)       {:action=>"create", :controller=>"devise/sessions"}
    destroy_member_session DELETE /members/sign_out(.:format)      {:action=>"destroy", :controller=>"devise/sessions"}
           member_password POST   /members/password(.:format)      {:action=>"create", :controller=>"devise/passwords"}
       new_member_password GET    /members/password/new(.:format)  {:action=>"new", :controller=>"devise/passwords"}
      edit_member_password GET    /members/password/edit(.:format) {:action=>"edit", :controller=>"devise/passwords"}
                           PUT    /members/password(.:format)      {:action=>"update", :controller=>"devise/passwords"}
cancel_member_registration GET    /members/cancel(.:format)        {:action=>"cancel", :controller=>"devise/registrations"}
       member_registration POST   /members(.:format)               {:action=>"create", :controller=>"devise/registrations"}
   new_member_registration GET    /members/sign_up(.:format)       {:action=>"new", :controller=>"devise/registrations"}
  edit_member_registration GET    /members/edit(.:format)          {:action=>"edit", :controller=>"devise/registrations"}
                           PUT    /members(.:format)               {:action=>"update", :controller=>"devise/registrations"}
                           DELETE /members(.:format)               {:action=>"destroy", :controller=>"devise/registrations"}
         new_admin_session GET    /admins/sign_in(.:format)        {:action=>"new", :controller=>"devise/sessions"}
             admin_session POST   /admins/sign_in(.:format)        {:action=>"create", :controller=>"devise/sessions"}
     destroy_admin_session DELETE /admins/sign_out(.:format)       {:action=>"destroy", :controller=>"devise/sessions"}
            admin_password POST   /admins/password(.:format)       {:action=>"create", :controller=>"devise/passwords"}
        new_admin_password GET    /admins/password/new(.:format)   {:action=>"new", :controller=>"devise/passwords"}
       edit_admin_password GET    /admins/password/edit(.:format)  {:action=>"edit", :controller=>"devise/passwords"}
                           PUT    /admins/password(.:format)       {:action=>"update", :controller=>"devise/passwords"}
 cancel_admin_registration GET    /admins/cancel(.:format)         {:action=>"cancel", :controller=>"devise/registrations"}
        admin_registration POST   /admins(.:format)                {:action=>"create", :controller=>"devise/registrations"}
    new_admin_registration GET    /admins/sign_up(.:format)        {:action=>"new", :controller=>"devise/registrations"}
   edit_admin_registration GET    /admins/edit(.:format)           {:action=>"edit", :controller=>"devise/registrations"}
                           PUT    /admins(.:format)                {:action=>"update", :controller=>"devise/registrations"}
                           DELETE /admins(.:format)                {:action=>"destroy", :controller=>"devise/registrations"}
                     films GET    /films(.:format)                 {:action=>"index", :controller=>"films"}
                           POST   /films(.:format)                 {:action=>"create", :controller=>"films"}
                  new_film GET    /films/new(.:format)             {:action=>"new", :controller=>"films"}
                 edit_film GET    /films/:id/edit(.:format)        {:action=>"edit", :controller=>"films"}
                      film GET    /films/:id(.:format)             {:action=>"show", :controller=>"films"}
                           PUT    /films/:id(.:format)             {:action=>"update", :controller=>"films"}
                           DELETE /films/:id(.:format)             {:action=>"destroy", :controller=>"films"}
                      root        /                                {:controller=>"films", :action=>"index"}

Routes.rb

FilmRepo::Application.routes.draw do
  devise_for :members

  devise_for :admins

  resources :films

  root :to => 'films#index'
end

Admin.rb (modèle)

class Admin < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :token_authenticatable, :encryptable, :confirmable, :lockable, and :omniauthable
  devise :database_authenticatable, :registerable, :timeoutable,
         :recoverable, :rememberable, :trackable, :validatable

  # Setup accessible (or protected) attributes for your model
  attr_accessible :email, :password, :password_confirmation, :remember_me
end

Membre.rb (modèle)

class Member < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :token_authenticatable, :encryptable, :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable

  # Setup accessible (or protected) attributes for your model
  attr_accessible :email, :password, :password_confirmation, :remember_me
end

Application.HTML.haml

!!!
%html
    %head
        %title Film Repo
        = stylesheet_link_tag 'compiled/screen.css', :media => 'screen, projection'
        = stylesheet_link_tag 'compiled/print.css', :media => 'print'
        /[if lt IE 8]
            = stylesheet_link_tag 'compiled/ie.css', :media => 'screen, projection'
            = csrf_meta_tag
    %body.bp
        #container
            #user_nav
                - if member_signed_in?
                    Signed in as #{current_member.email}. Not you?
                    #{link_to "Sign out", destroy_member_session_path}
                - else
                    = link_to "Sign up", new_member_registration_path
                    or #{link_to "sign in", new_member_session_path}
                - flash.each do |name, msg|
                    = content_tag :div, msg, :id => "flash_#{name}"
            = yield
23
demandé sur Joe 0000-00-00 00:00:00

19 réponses

J'ai eu un problème similaire, mais l'ajout de :method=>: delete n'a pas fonctionné. J'ai pu ajouter une nouvelle route pour une requête get en commentant devise_for: users et en ajoutant

devise_for :users do
  get '/users/sign_out' => 'devise/sessions#destroy'
end
43
répondu cramhead 2014-11-11 14:01:32

Vous pouvez terminer une session via get en modifiant la configuration devise dans les initialiseurs.

# The default HTTP method used to sign out a resource. Default is :delete.
config.sign_out_via = :get

Il suffit d'ouvrir le lien et votre session est supprimée.

41
répondu itkevin 2011-09-11 19:00:04

Bien que je ne connaisse pas la cause, la raison pour laquelle vous recevez ce message est que dans vos itinéraires vous avez

destroy_member_session DELETE /members/sign_out(.:format)      {:action=>"destroy", :controller=>"devise/sessions"}

Ce qui signifie que la route n'est disponible qu'avec la méthode DELETE par opposition à GET. C'est un peu bizarre car dans les docs for devise il est dit qu'il devrait le créer comme GET route (https://github.com/plataformatec/devise/blob/master/lib/devise/rails/routes.rb#L30)

Avec comme route de suppression, Vous devriez pouvoir vous déconnecter en utilisant

link_to :logout, destroy_member_session_path, :method => :delete 
20
répondu Olives 2011-07-04 17:14:11

J'ai eu un problème similaire. Mon code de vue était comme ceci:

  <%= link_to " exit", destroy_user_session_path, method: :delete %>

Après avoir ajouté la modification suivante aux routes.rb ça a marché,

devise_for :users

devise_scope :user do  
   get '/users/sign_out' => 'devise/sessions#destroy'     
end
16
répondu Reza 2015-05-07 07:56:31

J'avais juste besoin d'ajouter le

//= require jquery
//= require jquery_ujs

À mon application.js

16
répondu Victor Martins 2016-10-06 02:12:29

On peut toujours utiliser :method => :delete dans mon code, comme ça

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

La raison pour laquelle je pense que nous ne parvenons pas à charger javascript qui inclut jquery, assurez-vous que

= javascript_include_tag "application" (haml- you can use html too)

Pour inclure jquery ui et jquery-ujs. Donc, si c'est toujours une erreur, je suggère de changer rails gem dans GEMFILE à la version 3.2.6 et d'appeler bundle update pour mettre à jour les gemmes. Il fonctionne pour moi!

6
répondu duykhoa 2012-09-11 18:16:10
= link_to "Sign out", destroy_user_session_path,:method => :delete

NE FONCTIONNERA PAS à la place Utilisez ceci,

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

Devrait faire l'affaire ou pour le pire cas, ajoutez exiger jquery_ujs votre application.js

5
répondu Nikhil Nanjappa 2013-12-01 10:36:32

En concevoir.rb, le changement

 config.sign_out_via = :delete

À

config.sign_out_via = :get

Cela a fonctionné pour moi. Je suis devenu fou avec cela parce que la valeur par défaut est delete et je ne comprends pas pourquoi.

Cela fonctionne, mais je ne suis pas sûr si cela affecte d'autres éléments de l'application.

5
répondu loloso 2016-02-12 09:54:52

En utilisant Rails4, j'ai dû utiliser la méthode suivante:

<%= link_to "Logout", destroy_admin_session_path, method: :delete %>

Accent sur l'endroit où les deux points sont sur la méthode: et :supprimer

4
répondu Sam 2015-03-25 12:18:54

Peut être que cela aidera quelqu'un. Mis à niveau de Rails 3.0 à 3.1 et trouvé ce problème. Cela l'a corrigé pour moi:

Routes.rb:
devise_for: utilisateurs

Concevoir.rb:
config.sign_out_via =: Supprimer

Application.HTML.erb:

<%= javascript_include_tag "application" %>     

* non: valeurs par défaut

_login_items.HTML.erb:

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

App/assets/javascripts/de l'application.js

//= require jquery
//= require jquery-ui
//= require jquery_ujs
//= require_tree .

Et j'avais en javascript / jquery.js, jquery_ujs.js partir de la version 3.0 que j'ai supprimé.

3
répondu Katya B 2011-12-13 23:19:37

Vous avez peut-être supprimé assets / javascripts/ *

Exécuter {[1] } cela va générer tous les javascripts comme indiqué ci-dessous

xxxx@xxxxx:~/Projects/Rails_apps/rtest$ rails generate jquery:install --ui
      remove  public/javascripts/prototype.js
      remove  public/javascripts/effects.js
      remove  public/javascripts/dragdrop.js
      remove  public/javascripts/controls.js
     copying  jQuery (1.7.1)
      create  public/javascripts/jquery.js
      create  public/javascripts/jquery.min.js
     copying  jQuery UI (1.8.16)
      create  public/javascripts/jquery-ui.js
      create  public/javascripts/jquery-ui.min.js
     copying  jQuery UJS adapter (822920)
      remove  public/javascripts/rails.js
      create  public/javascripts/jquery_ujs.js

Accédez à votre mise en page par exemple application.HTML.erb et modifier <%= javascript_include_tag :all %>

Cela a fonctionné pour moi:)

3
répondu Bernard Banta 2011-12-29 17:13:33

FWIW j'ai aussi rencontré ce problème. Ont examiné toutes les réponses suggérées mais le seul qui a fonctionné était de foto routes ouvertes.rb et commenter la ligne suivante:

devise_for :users

En dessous, ajouter la ligne suivante:

devise_for :users do get '/users/sign_out' => 'devise/sessions#destroy' end
2
répondu Jason 2011-10-13 00:44:18

, Le problème commence avec rails 3.1 assets/javascript/. Il suffit de chercher application.js, et 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 nouvelle application... ce fichier est l'instance pour jquery.

2
répondu rome3ro 2012-11-10 23:53:29

@ creamhost dire,

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

Mais ce n'est pas une solution correcte pour moi (Rails4). J'ai résolu notre problème (Réponse de@Olives),

link_to :logout, destroy_member_session_path, method: :delete
2
répondu seyyah 2017-07-01 01:39:19

Utilisez simplement ce qui suit pour votre lien de déconnexion:

<%= link_to "Sign out", destroy_user_session_path, method: :delete %>
1
répondu phildub 2014-10-19 00:06:26
//= require jquery_ujs

Vous manquez cette ligne dans vos actifs. Il n'y a pas besoin d'obtenir la requête /users/signout. Mettez cette ligne dans le fichier JavaScript tout en haut de la page.

1
répondu Idrees Ibrahim 2016-08-02 12:24:33

A eu le même problème et s'est souvenu qu'il n'a commencé à se produire qu'après avoir décidé de "nettoyer" mes fichiers Javascript. J'ai donc couru rails generate jquery:install --ui à nouveau et cela l'a résolu pour moi. (Vous pouvez ignorer la partie --ui si vous n'avez pas besoin de L'interface utilisateur JQuery, je suppose.)

0
répondu octimizer 2011-07-19 20:02:36

Je recevais la même erreur que L'OP avait pour / users / sign_out parce que je L'obtenais au lieu de le supprimer (je suis aussi un développeur de 1ère année). Après avoir vérifié github via cette réponse, j'ai soumis la demande de tirage pour la corriger!

Https://github.com/plataformatec/devise/pull/2040

Aller S. O. !!!

0
répondu RudyOnRails 2012-08-23 16:40:27

Cela n'arrive que sur windows.. Ajouter la chose suivante à votre Demande.HTML.dossier erb.

Devise_for: utilisateurs

Devise_scope :l'utilisateur ne
get '/users/sign_out' => 'concevoir/les sessions#détruire'
fin

-2
répondu Kartikey Garg 2016-12-05 21:43:56