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
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
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.
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
J'avais juste besoin d'ajouter le
//= require jquery
//= require jquery_ujs
à mon application.js
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
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!
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.
= 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
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
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.
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 :)
@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
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.
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
Utilisez simplement ce qui suit pour votre lien de déconnexion:
<%= link_to "Sign out", destroy_user_session_path, method: :delete %>
//= 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.
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.)