我已经在我的应用程序上安装了设计,并在我的application.html.erb文件中应用了以下内容:

<div id="user_nav">
    <% if user_signed_in? %>
        Signed in as <%= current_user.email %>. This cannot be cheese?
        <%= link_to 'Sign out', destroy_user_session_path %>
    <% else %>
        <%= link_to 'Register', new_user_registration_path %> or <%= link_to 'Sign in', new_user_session_path %>
    <% end %>
</div>

我运行了rake路由,确认所有路由都是有效的。

同样,在我的路线上。我有belonge_for:users和root:to => "home#index"。

当点击“签出”链接时,我得到以下路由错误:

No route matches "/users/sign_out"

知道是什么导致了这个错误吗?


当前回答

这个问题已经有很多答案了。对我来说,问题有两个方面:

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: <%= link_to "Sign out", destroy_user_session_path, :method => :delete %>

其他回答

如果你使用的是Rails 3.1,确保你的application.html.erb签出如下所示:

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

你的javascript包含行如下所示

<%= javascript_include_tag 'application' %>

我的猜测是一些宝石覆盖了default.js位置的新结构。

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

我在rails 3.1.0中遇到了同样的问题,我解决了在文件中添加以下行:

app/assets/javascripts/application.js
//= require_tree
//= require jquery
//= require jquery_ujs

在github中查看源代码:

https://github.com/plataformatec/devise/commit/adb127bb3e3b334cba903db2c21710e8c41c2b40#lib/generators/templates/devise.rb(日期:2011年6月27日)

#用于签出资源的默认HTTP方法。默认为:get。 188 #配置。Sign_out_via =:get 187 #用于签出资源的默认HTTP方法。默认值为:delete。 188 配置。Sign_out_via =:delete

不要忘记在你的application.js (Rails 3)中包含下面这行代码

//= require_self
//= require jquery
//= require jquery_ujs

将jquery_ujs包含到我的rails应用程序中,它现在可以工作了。