繁体   English   中英

具有Devise的Rails 3.2:注销链接停止工作

[英]Rails 3.2 with Devise: logout link stopped working

我的应用程序中的注销链接运行正常,然后就停止了工作。 我已经有一段时间没有对其进行测试了,但是一个月来我都没有对其进行任何更改! 当控制器将其解释为DELETE请求时,它将发送GET请求。 这是我的代码:

我认为我的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

我不知道我在这里想念的是什么。 我知道我可以解决,但是该链接应该可以正常工作,直到现在,而且我想知道为什么不行。

当我阅读jquery_ujs文件时,我发现似乎通过在document上设置事件侦听器将链接从GET变为DELETE ,如下所示:

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

有一次在我的应用中,我遇到了一个复杂的情况,我需要从document删除一个click事件,并且由于我没有使用任何其他点击处理程序,因此我只调用了$(document).off('click'); 这将删除正在侦听document上的单击事件的所有document 显然,这是一件非常不好的事情。 我用专门删除我的点击处理程序的东西代替了那行,然后一切又恢复了。

这个教训是,如果您使用的是jQuery_ujs ,则除非可以针对特定的处理程序,否则不要在document上使用off()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM