web-dev-qa-db-fra.com

Aucun itinéraire ne correspond à [GET] "/ users / sign_out"

Voici mon erreur réelle: No route matches [GET] "/members/sign_out" Étant donné que la plupart des gens utiliseront des "utilisateurs", j'ai pensé qu'il serait plus utile d'avoir cela dans le titre. En tout cas, je suis absolument 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. De plus, j'ai généré deux modèles de devise séparés - l'un appelé "membres" et l'autre appelé "admins". J'ai pu pour vous inscrire et vous connecter aux deux (simultanément) en naviguant manuellement vers le chemin URL correct (par exemple, localhost: 3000/admins/sign_in /). J'ai créé des liens dans mon fichier de mise en page application.html.haml en suivant ceci - RailsCast on Devise . Je suis conscient qu'il ne traite que des liens de connexion/déconnexion 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 des URL de déconnexion (c'est-à-dire localhost: 3000/admins/sign_out /).

Quelqu'un peut-il me dire pourquoi cela se produit? Vous trouverez ci-dessous les différents fichiers associés. Et bien sûr, je suis un débutant ...

rake routes sortie:

    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

member.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
26
Joe

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 le devise_for: users et en ajoutant

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

Vous pouvez terminer une session via get en modifiant la configuration du périphérique dans les initialiseurs.

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

Ouvrez simplement le lien et votre session est supprimée.

45
itkevin

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 l'itinéraire n'est disponible qu'avec la méthode DELETE par opposition à GET. C'est un peu bizarre car dans la documentation de la conception, il est dit qu'il devrait le créer en tant que route GET (https://github.com/plataformatec/devise/blob/master/lib/devise/Rails/routes.rb#L30)

Avec cette route comme DELETE, vous devriez pouvoir vous déconnecter en utilisant

link_to :logout, destroy_member_session_path, :method => :delete 
21
Olives

J'avais juste besoin d'ajouter le

//= require jquery
//= require jquery_ujs

à mon application.js

18
Victor Martins

J'avais 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 à routes.rb, cela a fonctionné,

devise_for :users

devise_scope :user do  
   get '/users/sign_out' => 'devise/sessions#destroy'     
end
17
Reza

Nous pouvons 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 les javascript qui incluent jquery, assurez-vous

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

pour inclure jquery-ui et jquery-ujs. Donc, si l'erreur persiste, je suggère de changer Rails gem dans GEMFILE à la version 3.2.6 et d'appeler bundle update pour mettre à jour les gemmes. Ça marche pour moi!

6
duykhoa

Dans devise.rb, changez

 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 que cela affecte d'autres éléments de l'application.

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

va PAS travailler à la place utiliser ceci,

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

devrait faire l'affaire ou dans le pire des cas, ajoutez require jquery_ujs dans votre application.js

5
Nikhil Nanjappa

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

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

Accent sur l'emplacement des deux-points sur la méthode: et: supprimer

4
Sam

Peut-être que cela aidera quelqu'un. Mise à jour de Rails 3.0 à 3.1 et trouvé ce problème. Cela a résolu le problème pour moi:

routes.rb:
concevoir_for: utilisateurs

devise.rb:
config.sign_out_via =: supprimer

application.html.erb:

<%= javascript_include_tag "application" %>     

* non: par défaut

_login_items.html.erb:

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

app/assets/javascripts/application.js

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

et j'avais dans javascript/jquery.js, jquery_ujs.js de la version 3.0 que j'ai supprimée.

3
Katya B

Vous avez peut-être supprimé des éléments/javascripts/*

Courir Rails generate jquery:install --ui cela générera 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 modifiez <%= javascript_include_tag :all %>

Cela a fonctionné pour moi :)

3
Bernard Banta

@creamhost dit,

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

mais ce n'est pas la bonne solution pour moi (Rails4). J'ai résolu notre problème (réponse de @Olives),

link_to :logout, destroy_member_session_path, method: :delete
2
seyyah

Le problème commence par Rails 3.1 in assets/javascript/. Recherchez simplement 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 de jquery.

2
rome3ro

FWIW J'ai également rencontré ce problème. J'ai examiné toutes les réponses suggérées, mais la seule qui a fonctionné a été de foto open routes.rb et de commenter la ligne suivante:

devise_for :users

En dessous, ajoutez la ligne suivante:

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

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

<%= link_to "Sign out", destroy_user_session_path, method: :delete %>
1
phildub
//= require jquery_ujs

Il vous manque cette ligne dans vos actifs. Il n'est pas nécessaire d'obtenir /users/signout demande. Mettez cette ligne dans le fichier JavaScript tout en haut de la page.

1
Idrees Ibrahim

J'ai eu le même problème et je me suis souvenu que cela n'a commencé que lorsque j'ai décidé de "nettoyer" mes fichiers Javascript. Alors j'ai couru Rails generate jquery:install --ui encore 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
octimizer