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

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


当前回答

看看你的路线。Rb有一个“resource:users”在“belonge_for:users”之前,然后尝试交换它们:

作品 devise_for:用户 资源:用户 失败 资源:用户 devise_for:用户

其他回答

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

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

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

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

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

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

尝试添加一个新的路由来设计/sessions#destroy并链接到它。例如:

routes.rb
devise_for :users do
  get 'logout' => 'devise/sessions#destroy'
end

观点:

<%= link_to "Logout", logout_path %>

另一个选项是将注销配置为GET而不是DELETE,您可以在/config/initializers/ devie.rb上添加以下行

config.sign_out_via = :get

但正如Steve Klabnik在他的博客(http://blog.steveklabnik.com/2011/12/11/devise-actioncontroller-routingerror-no-route-matches-get-slash-users-slash-sign-out.html)上所写的,尝试使用DELETE,因为这种方法的语义。

在你的路线上。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

在你的application.html.erb中:

<%if user_signed_in?%>
          <li><%= link_to "Sign_out", sign_out_path %></li>
<% end %>