我已经在我的应用程序上安装了设计,并在我的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"

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


当前回答

在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

其他回答

我认为退出的路由是一个DELETE方法。这意味着你的签出链接需要看起来像这样:

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

你的不包括:method =>:delete部分。另外,请注意,要实现这个功能,你还必须在布局文件(application.html.erb)中包含<%= javascript_include_tag:defaults %>。

只有一个例外,杰西的回答对我很管用:

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

变化:

:delete

... :

'delete'

所以对我有用的代码是:

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

这就是我所做的(Rails 3.0和design 1.4.2):

确保你的页面加载rails.js 使用这个参数:'data-method' => 'delete' 添加这个参数是个好主意::rel => 'nofollow'

大多数答案都是片面的。这个问题我已经遇到过很多次了。有两件事需要解决:

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

删除方法需要指定

然后设计使用jquery,所以你需要加载这些

   <%= javascript_include_tag "myDirectiveJSfile" %> 

确保在myDirectiveJSfile.js中同时指定了jquery和jquery-ujs

//= require jquery
//= require jquery_ujs

如果你使用的是HTTPS,如果你的签出链接是不安全的版本,它就会崩溃。在后端,它重定向到安全版本。这个重定向是一个GET,它导致了这个问题。

确保你的链接使用HTTPS。你可以在你的url助手中强制使用协议:“https”(确保你使用url助手而不是路径助手)。

<%= link_to "Sign out", destroy_user_session_url(protocol: "https"), method: :delete %>