可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I've installed devise on my app and applied the following in my application.html.erb
file:
Signed in as . This cannot be cheese? or
I ran rake routes
and confirmed that all the routes are valid.
Also, in my routes.rb
file I have devise_for :users
and root :to => "home#index"
.
I get the following routing error when clicking the "Sign out" link:
No route matches "/users/sign_out"
Any ideas what's causing the error?
回答1:
I think the route for signing out is a DELETE
method. This means that your sign out link needs to look like this:
:delete %>
Yours doesn't include the :method => :delete
part. Also, please note that for this to work you must also include
in your layout file (application.html.erb
).
回答2:
I changed this line in devise.rb:
config.sign_out_via = :delete
to
config.sign_out_via = :get
and it started working for me.
回答3:
You probably didn't include jquery_ujs javascript file. Make sure you are using the latest version of jquery-ujs : https://github.com/rails/jquery-ujs and the last files available :
rails generate jquery:install
You should not have any more rails.js file. If you do, you're probably out-of-date. Make sure also this file is loaded with defaults, in config/application.rb
config.action_view.javascript_expansions[:defaults] = %w(jquery.min jquery_ujs)
(Again, you should not have rails.js file here). Finally, add the link as documented on Devise wiki (haml-style):
= link_to('Logout', destroy_user_session_path, :method => 'delete')
And everything will be fine.
回答4:
The ability to make the Logout link a DELETE RESTful call requires an html attribute data-method = "delete"
by using the rails code = link_to('Logout', destroy_user_session_path, :method => :delete)
.
However, if you do not have the gem jquery-ujs
installed or are not calling the resulting javascript in your application.html via = javascript_include_tag "application"
, the response will be sent as a GET request, and the route will fail.
You have a few options if you do not want to use jquery-ujs
or cannot find a way to make it work:
- Change
config.sign_out_via
to equal :get
within devise.rb
(not recommended, since DELETE is the appropriate RESTful query) - OR Change the
link_to
to = button_to('Logout', destroy_user_session_path, :method => :delete)
. With button_to
Rails will do the heavy lifting on making the proper DELETE call. You can then style the button to look like a link if you wish.
回答5:
Try adding a new route to devise/sessions#destroy and linking to that. Eg:
routes.rb devise_for :users do get 'logout' => 'devise/sessions#destroy' end
view:
回答6:
I had the same problem with rails 3.1.0, and I solved adding in file the followings lines:
app/assets/javascripts/application.js //= require_tree //= require jquery //= require jquery_ujs
回答7:
Use it in your routes.rb file:
devise_for :users do get '/users/sign_out' => 'devise/sessions#destroy' end
回答8:
With one exception, Jessie's answer worked for me:
:delete %>
change:
:delete
... to:
'delete'
So the code that worked for me is:
'delete' %>
回答9:
Many answers to the question already. For me the problem was two fold:
when I expand my routes:
devise_for :users do get '/users/sign_out' => 'devise/sessions#destroy' end
I was getting warning that this is depreciated so I have replaced it with:
devise_scope :users do get '/users/sign_out' => 'devise/sessions#destroy' end
I thought I will remove my jQuery. Bad choice. Devise is using jQuery to "fake" DELETE request and send it as GET. Therefore you need to:
//= require jquery //= require jquery_ujs
and of course same link as many mentioned before:
:delete %>
回答10:
Add:
and to layouts
Use these link_to tags
link_to 'Sign out', destroy_user_session_path, :method => :delete or link_to 'Sign out', '/users/sign_out', :method => :delete
In routes add:
devise_for :users do get '/users/sign_out' => 'devise/sessions#destroy' end
回答11:
Other option is to configure the logout to be a GET instead a DELETE, you can do that adding the following line on /config/initializers/devise.rb
config.sign_out_via = :get
But as Steve Klabnik wrote on his blog (http://blog.steveklabnik.com/2011/12/11/devise-actioncontroller-routingerror-no-route-matches-get-slash-users-slash-sign-out.html) try to use DELETE because of the semantic of this method.
回答12:
If you are using Rails 3.1 make sure your application.html.erb sign out looks like:
:delete %>
And that your javascript include line looks like the following
My guess is that some gems overwrite the new structure of the default.js location.
回答13:
Check it out with source code in github:
https://github.com/plataformatec/devise/commit/adb127bb3e3b334cba903db2c21710e8c41c2b40#lib/generators/templates/devise.rb (date : June 27, 2011 )
- # The default HTTP method used to sign out a resource. Default is :get. 188
- # config.sign_out_via = :get 187
- # The default HTTP method used to sign out a resource. Default is :delete. 188
- config.sign_out_via = :delete
回答14:
Well, guys for me it was only remove the :method => :delete
回答15:
This means you haven't generated the jquery files after you have installed the jquery-rails gem. So first you need to generate it.
rails generate devise:install
First Option:
This means either you have to change the following line on /config/initializers/devise.rb
config.sign_out_via = :delete to config.sign_out_via = :get
Second Option:
You only change this line
to :delete %>
on the view file.
Usually :method => :delete
is not written by default.
回答16:
I want to add to this even though it's a bit old.
the "sign_out" link didn't work, despite having :method => :delete.
The comment indicating that
must be included reminded me I had recently added JQuery java script and used simple
tags to include them.
When I moved them from after the :defaults to before, the sign_out started working again.
Hopefully this helps someone.
回答17:
Don't forget to include the following line in your application.js (Rails 3)
//= require_self //= require jquery //= require jquery_ujs
Include jquery_ujs
into my rails application and it works now.
回答18:
Most answers are partial. I have hit this issue many times. Two things need to be addressed:
:delete) %>
the delete method needs to be specified
Then devise uses jquery, so you need to load those
and ensure that BOTH jquery and jquery-ujs are specified in your myDirectiveJSfile.js
//= require jquery //= require jquery_ujs
回答19:
If you're using HTTPS with devise, it'll break if your sign-out link is to the non-secure version. On the back end, it redirects to the secure version. That redirect is a GET, which causes the issue.
Make sure your link uses HTTPS. You can force it with protocol: "https"
in your url helper (make sure you use the url helper and not the path helper).
回答20:
devise_for :users devise_scope :user do get '/users/sign_out' => 'devise/sessions#destroy' end
回答21:
In your 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
and in your application.html.erb:
回答22:
This is what I did (with Rails 3.0 and Devise 1.4.2):
- Make sure your page loads rails.js
- Use this param: 'data-method' => 'delete'
- Good idea to add this param: :rel => 'nofollow'
回答23:
the ':method => :delete
' in page is 'data-method="delete"
' so your page must have jquery_ujs.js, it will submit link with method delete not method get
回答24:
The problem begin with rails 3.1... in /app/assets/javascript/
just look for application.js.
If the file doesn't exist create a file with that name I don't know why my file disappear or never was created on "rails new app"...
.
That file is the instance for jquery...
.
回答25:
Lots of solutions are there. but mostly use this,
or config devise.rb with proper sign_out method
In devise.rb
config.sign_out_via = :delete ( or :get which u like to use.)
回答26:
use :get
and :delete
method for your path:
devise_scope :user do match '/users/sign_out' => 'devise/sessions#destroy', :as => :destroy_user_session, via: [:get, :delete] end
回答27:
See if your routes.rb has a "resource :users" before a "devise_for :users" then try swapping them:
Works
- devise_for :users
- resources :users
Fails
- resources :users
- devise_for :users
回答28:
In general when you get "No route matches" but you think you have that route defined then double check the http verb / request method (whether its get, put, post, delete etc.) for that route.
If you run rake routes then you will see the expected method and you can compare this with the request log.
回答29:
I know this is an old question based on Rails 3 but I just ran into and solved it on Rails 4.0.4. So thought I'd pitch in how I fixed it for anyone encountering this problem with this version. Your mileage may vary but here's what worked for me.
First make sure you have the gems installed and run bundle install.
gem 'jquery-rails' gem 'turbolinks' gem 'jquery-turbolinks'
In application.js check that everything is required like below.
Beware if this gotcha: it's //= require jquery.turbolinks
and not //= require jquery-turbolinks
//= require jquery //= require jquery_ujs //= require jquery.turbolinks //= require turbolinks //= require_tree .
Next, add the appropriate links in the header of application.html.erb.
true %>
There seems to be many variations on how to implement the delete method which I assume depends on the version of Rails you are using. This is the delete
syntax I used.
'delete' %>
Hope that helps dig someone out of this very frustrating hole!