我已经在我的应用程序上安装了设计,并在我的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"
知道是什么导致了这个错误吗?
你可能没有包含jquery_ujs javascript文件。请确保您使用的是最新版本的jquery-ujs: https://github.com/rails/jquery-ujs和最后可用的文件:
rails generate jquery:install
你应该没有更多的rails.js文件了。如果你这样做了,你可能已经过时了。
还要确保该文件在config/application.rb中加载了默认值
config.action_view.javascript_expansions[:defaults] = %w(jquery.min jquery_ujs)
(同样,这里不应该有rails.js文件)。
最后,添加在维基百科上的链接:
= link_to('Logout', destroy_user_session_path, :method => 'delete')
一切都会好起来的。
Add:
<%= 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
这意味着在安装jquery-rails gem之后还没有生成jquery文件。首先你需要生成它。
Rails生成设计:安装
第一选择:
这意味着你必须改变/config/initializers/ design .rb上的下面一行
配置。Sign_out_via =:delete to config。Sign_out_via =:get
第二选择:
你只需要在视图文件中将<%= link_to "Sign out", destroy_user_session_path %>改为<%= link_to "Sign out", destroy_user_session_path,:method =>:delete %>。
通常:method =>:delete默认不写入。
让Logout链接成为DELETE RESTful调用的能力需要一个html属性data-method = " DELETE ",使用rails code = link_to('Logout', destroy_user_session_path,:method =>: DELETE)。
然而,如果你没有安装gem jquery-ujs,或者没有在你的application.html via = javascript_include_tag "application"中调用结果的javascript,响应将作为GET请求发送,路由将失败。
如果你不想使用jquery-ujs或者找不到让它工作的方法,你有几个选择:
改变配置。Sign_out_via等于:进入设计。rb(不推荐,因为DELETE是合适的RESTful查询)
或将link_to更改为= button_to('Logout', destroy_user_session_path,:method =>:delete)。使用button_to, Rails将在进行正确的DELETE调用时完成繁重的工作。然后,如果您愿意,可以将按钮样式设置为看起来像一个链接。
大多数答案都是片面的。这个问题我已经遇到过很多次了。有两件事需要解决:
<%= 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
我知道这是一个基于Rails 3的老问题,但我刚刚在Rails 4.0.4上遇到并解决了它。所以我认为我是如何修复它的任何人遇到这个问题与这个版本。不同的人可能有不同的想法,但以下是对我有用的方法。
首先确保已经安装了gems并运行bundle install。
gem 'jquery-rails'
gem 'turbolinks'
gem 'jquery-turbolinks'
在application.js中检查是否需要如下所示的所有内容。
注意,如果你这样做了:它是//= require jquery。Turbolinks和not //= require jquery-turbolinks
//= require jquery
//= require jquery_ujs
//= require jquery.turbolinks
//= require turbolinks
//= require_tree .
接下来,在application.html.erb的头文件中添加适当的链接。
<%= javascript_include_tag "application", "data-turbolinks-track" => true %>
<%= javascript_include_tag :defaults %>
关于如何实现delete方法,似乎有很多不同的方法,我认为这取决于您所使用的Rails版本。
这是我使用的删除语法。
<p><%= link_to "Sign Out", destroy_user_session_path, :method => 'delete' %></p>
希望这能帮助一些人走出这个非常令人沮丧的洞!
我正在使用rails。所以这就是我必须要做的。重要的位是data: {turbo_method::delete}
<%= link_to t('nav.logout'), destroy_user_session_path, class: "nav-link", data: { turbo_method: :delete } %>
下面是rails在生成项目时创建的默认值。
application.html.erb
<%= javascript_include_tag "application", "data-turbo-track": "reload", defer: true %>
application.js
import "@hotwired/turbo-rails"
import "./controllers"
import * as bootstrap from "bootstrap"
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,如果由于某些原因上面的不工作