ruby-on-rails - rails ails 3无路由匹配 “/users/sign_out”

  显示原文与译文双语对照的内容

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


<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 routes 并确认所有路由都有效。

另外,在我的routes.rb 文件中,我有 devise_for :usersroot :to =>"home#index"

单击"注销"链接时,出现以下路由错误:


No route matches"/users/sign_out"

任何导致错误的想法?

时间:

我认为注销的路由是 DELETE 方法。 这意味着你的注销链接需要如下所示 <%= link_to"Sign out", destroy_user_session_path, :method => :delete %> 你的不包括 :method => :delete 部件。 另外,请注意,为了使你能够工作,你还必须包括 <%= javascript_include_tag :defaults %> 在布局文件 application.html. 中) 。

我在 devise.rb 中修改了此行:


config.sign_out_via = :delete


config.sign_out_via = :get

它开始为我工作了。

你可能没有包含 jquery_ujs javascript文件。 确保你使用的是最新版本的jquery-ujs: https://github.com/rails/jquery-ujs 和最后一个可用的文件:


rails generate jquery:install

不你应该 rails.js 有任意多个文件。 如果是的话,你可能是 out-of-date 。 确保这里文件在配置/应用程序中加载了默认值。


config.action_view.javascript_expansions[:defaults] = %w(jquery.min jquery_ujs)

( 同样,你应该不 有 rails.js 文件过来了。 最后,在设计 wiki web ( haml-style ) 上添加链接:


= link_to('Logout', destroy_user_session_path, :method => 'delete')

一切都会好起来的。

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


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

视图:


<%= link_to"Logout", logout_path %>

使用 Rails code,已经实现基本 data-method ="delete" 注销链接一个删除rest调用需要一个html属性的能力 = link_to('Logout', destroy_user_session_path, :method => :delete)

但是,如果你没有安装 gem jquery-ujs,或者没有在你的application.html 中调用生成的javascript = javascript_include_tag"application" ,响应将作为一个获取请求发送,路由将失败。

如果你不想使用 jquery-ujs 或者找不到使它的工作的方法,你就有几个选项:

  1. config.sign_out_via 更改为等 :getdevise.rb 内( 不推荐,因为删除是相应的rest查询)
  2. 或者将 link_to 更改为 = button_to('Logout', destroy_user_session_path, :method => :delete)button_to Rails 将对进行正确的删除调用进行繁重的提升。 如果你愿意,你可以将按钮样式设置为链接。

Rails 3.1.0有同样的问题,我解决了在以下几行中添加文件:


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

有一个例外,杰西为我工作的答案是:


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

更改:

 
:delete

 

。到:

 
'delete'

 

所以为我工作的代码是:


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

对这个问题的许多回答。 对我来说问题是两个折叠:

  1. 扩展路由时:

    
    devise_for :users do 
     get '/users/sign_out' => 'devise/sessions#destroy'
    end
    
    
  2. 我收到警告,这是被折旧的,所以我已经用以下方法替换了它:

    
    devise_scope :users do
     get '/users/sign_out' => 'devise/sessions#destroy'
    end
    
    
  3. 我想我会删除我的jQuery 。 错误的选择。设计使用jQuery来删除请求并将它的发送给GET获取。 因此你需要:

    
    //= require jquery
    //= require jquery_ujs
    
    
  4. 当然,与前面提到的链接相同:

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

添加:


 <%= csrf_meta_tag %> and 
 <%= javascript_include_tag :defaults %> to layouts

使用这些link_to标记


 link_to 'Sign out', destroy_user_session_path, :method => :delete

 or

 link_to 'Sign out', '/users/sign_out', :method => :delete

在路由添加中:


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

...