Rails 3.2 with Devise:注销链接停止工作

时间:2013-12-20 07:34:24

标签: jquery html ruby-on-rails ruby-on-rails-3 devise

我的应用中的注销链接工作正常,然后它就停止了工作。我暂时没有对它进行过测试,但是我对一段相关的任何事情都没有任何改变!当它应由控制器解释为GET请求时,它正在发送DELETE请求。这是我的代码:

我的视图中的我的ERB文件包含以下行:

<li><%= link_to('Log Out', destroy_user_session_path, :method => :delete)%></li>

还包括:

<%= javascript_include_tag "application" %>

这是来自我的application.js

//
//= require jquery
//= require jquery_ujs
//= require underscore
//= require backbone
//= require jquery.serializeJSON
//= require jquery-ui-1.10.3.custom
//= require jquery-ui-touchpunch.min.js
//= require auto_form_bot
//= require_tree ../templates
//= require_tree ./models
//= require_tree ./collections
//= require_tree ./views
//= require_tree ./routers
//= require_tree .

以下是我的gemfile中的相关内容:

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>

当我点击链接时,这是我得到的错误:

Routing Error
No route matches [GET] "/users/sign_out"

这是我的服务器日志:

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请求,但它已不再存在,而且我不知道我更改了哪些内容停止工作。

更奇怪的是,每隔一段时间它就会有效!并且相同的链接适用于我的应用中的另一个页面。这是我的应用程序的模拟帐户的链接,您将在其中自动登录,因此您可以注销:http://www.form-itable.com/accounts/demo

我无法弄清楚我在这里缺少什么。我知道我可以做一个解决方法,但链接应该工作并且工作到现在为止,我想知道它为什么不是。

1 个答案:

答案 0 :(得分:1)

当我阅读jquery_ujs files时,我看到它似乎通过在GET上设置事件监听器,将链接从DELETE转换为document,就像这样:

// 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 ...

在我的应用程序中,我有一个复杂的情况,我需要从click删除document事件,因为我没有使用任何其他点击处理程序,我只是打电话$(document).off('click');删除了在document上收听点击事件的所有内容。显然,这是一件非常糟糕的事情。我用专门删除了我的点击处理程序的东西替换了那一行,一切都恢复了。

经验教训是,如果您使用jQuery_ujs ,请不要在off()上使用document,除非您可以定位特定处理程序