No route matches "/users/sign_out" devise rails 3
I think the route for signing out is a DELETE
method. This means that your sign out link needs to look like this:
<%= link_to "Sign out", destroy_user_session_path, :method => :delete %>
Yours doesn't include the :method => :delete
part. Also, please note that for this to work you must also include <%= javascript_include_tag :defaults %>
in your layout file (application.html.erb
).
I changed this line in devise.rb:
config.sign_out_via = :delete
to
config.sign_out_via = :get
and it started working for me.
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.
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
withindevise.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)
. Withbutton_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.