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

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


当前回答

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

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

其他回答

For Rails 7

我们在importmap中手动导入jquery和jquery-ujs。rb:

pin "jquery", to: "https://ga.jspm.io/npm:jquery@3.6.0/dist/jquery.js"
pin "jquery-ujs", to: "https://cdnjs.cloudflare.com/ajax/libs/jquery-ujs/1.2.3/rails.min.js"

或者对于jquery使用:

./bin/importmap pin jquery

然后手动输入jquery-ujs的第二行

我们用下面的代码创建文件:app/javascript/src/jquery.js:

import jquery from 'jquery'
window.jQuery = jquery
window.$ = jquery

然后我们将它们导入app/javascript/application.js:

import "src/jquery"
import "jquery-ujs"

我们不需要改变配置就完成了。Sign_out_via =:delete of device .rb

**注意:对于jquery可能需要一个yarn,如果由于某些原因上面的不工作

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

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 %>

页面中的“:method =>:delete”是“data-method="delete"” 所以你的页面必须有jquery_ujs.js,它会用delete方法提交链接,而不是用get方法

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

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

变化:

:delete

... :

'delete'

所以对我有用的代码是:

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

另一个选项是将注销配置为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,因为这种方法的语义。