Jquery Rails 3.2带装置:注销链接停止工作
我的应用程序中的注销链接一直工作正常,然后就停止工作了。我已经有一段时间没有测试它了,但是我已经有一个月没有对任何与它相关的东西做任何更改了!当控制器应将其解释为Jquery Rails 3.2带装置:注销链接停止工作,jquery,html,ruby-on-rails,ruby-on-rails-3,devise,Jquery,Html,Ruby On Rails,Ruby On Rails 3,Devise,我的应用程序中的注销链接一直工作正常,然后就停止工作了。我已经有一段时间没有测试它了,但是我已经有一个月没有对任何与它相关的东西做任何更改了!当控制器应将其解释为删除请求时,它正在发送获取请求。这是我的密码: 我的视图中的我的ERB文件包括以下行: <li><%= link_to('Log Out', destroy_user_session_path, :method => :delete)%></li> 以下是我的GEM文件中的相关内容: sour
删除
请求时,它正在发送获取
请求。这是我的密码:
我的视图中的我的ERB文件包括以下行:
<li><%= link_to('Log Out', destroy_user_session_path, :method => :delete)%></li>
以下是我的GEM文件中的相关内容:
source 'https://rubygems.org'
ruby "1.9.3"
gem 'rails', '3.2.13'
gem 'backbone-on-rails', '~> 1.1'
gem 'compass-rails'
gem 'devise', '>= 3.1.0'
gem 'ejs'
gem 'figaro'
gem 'jquery-rails'
gem 'pg'
gem 'sass-rails', '~> 3.2.3'
这是呈现的实际html:
<li><a href="/users/sign_out" data-method="delete" rel="nofollow">Log Out</a></li>
这是我的服务器日志:
Started GET "/users/sign_out" for 127.0.0.1 at 2013-12-19 23:49:24 -0500
ActionController::RoutingError (No route matches [GET] "/users/sign_out")
以下是相关路线:
new_user_session GET /users/sign_in(.:format) devise/sessions#new
user_session POST /users/sign_in(.:format) devise/sessions#create
destroy_user_session DELETE /users/sign_out(.:format) devise/sessions#destroy
链接生成的GET
请求应该自动更改为DELETE
请求,但现在不再是了,我不知道我更改了什么使其停止工作
更奇怪的是,每隔一段时间它就真的起作用了!在我的应用程序的另一个页面上也有相同的链接。这里是指向我的应用程序演示帐户的链接,您将在其中自动登录,以便您可以注销:
我想不出我在这里遗漏了什么。我知道我可以做一个变通方法,但是链接应该可以工作,并且到现在为止工作得很好,我想知道为什么不行。当我阅读时,我看到它似乎通过在
文档上设置一个事件侦听器,将链接从GET
转换为DELETE
,如下所示:
// Link elements bound by jquery-ujs
linkClickSelector: 'a[data-confirm], a[data-method], a[data-remote], a[data-disable-with]'
在我的应用程序中,有一次我遇到了一个复杂的情况,我需要从文档中删除click
事件,因为我没有使用任何其他的click处理程序,所以我只调用$(document).off('click')
删除所有正在侦听的内容,单击文档上的事件。显然,这是一件非常糟糕的事情。我用专门删除了我的点击处理程序的东西替换了这一行,一切都恢复了正常
教训是,如果您使用jQuery_ujs千万不要在文档上使用off()
,除非您可以针对特定的处理程序
应该有POST
请求而不是DELETE
或GET
,因为某些浏览器不支持DELETE`method@hawk,你是对的,但是因为它是一个链接,所以它只能获取
,但是由于数据方法=“删除”
部分,它应该自动更改为删除
。它在我的应用程序中的其他地方起作用。Rails会将method::delete
扩展为类似这样的
,然后只有在这之后,你的服务器才会威胁你的请求为delete
请求而不是浏览器。我认为你的javascript部分检查有问题jquery\u ujs
会按预期在每个页面上加载,每个页面上都会触发document.ready
事件是的,页面加载后似乎不会调用rails.js。handleMethod是将get方法更改为delete的方法。或者,您可以在designe.rb中将config.sign_out_via=:delete
更改为config.sign_via=:get
,以使事情正常运行。
Started GET "/users/sign_out" for 127.0.0.1 at 2013-12-19 23:49:24 -0500
ActionController::RoutingError (No route matches [GET] "/users/sign_out")
new_user_session GET /users/sign_in(.:format) devise/sessions#new
user_session POST /users/sign_in(.:format) devise/sessions#create
destroy_user_session DELETE /users/sign_out(.:format) devise/sessions#destroy
// Link elements bound by jquery-ujs
linkClickSelector: 'a[data-confirm], a[data-method], a[data-remote], a[data-disable-with]'
$document.delegate(rails.linkClickSelector, 'click.rails', function(e) {
var link = $(this), method = link.data('method'), data = link.data('params'), metaClick = e.metaKey || e.ctrlKey;
... more code ...