2013-12-20 81 views
1

我的應用中的註銷鏈接一直工作正常,然後它就停止工作。我有一段時間沒有測試過,但一個月後我還沒有對它做任何改變!當它被控制器解釋爲DELETE請求時,它發送一個GET請求。這裏是我的代碼:設計Rails 3.2:註銷鏈接停止工作

在我看來,我的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="https://stackoverflow.com/users/sign_out" data-method="delete" rel="nofollow">Log Out</a></li> 

當我點擊的鏈接,這裏是我的錯誤:

Routing Error 
No route matches [GET] "https://stackoverflow.com/users/sign_out" 

這裏是我的服務器日誌:

Started GET "https://stackoverflow.com/users/sign_out" for 127.0.0.1 at 2013-12-19 23:49:24 -0500 

ActionController::RoutingError (No route matches [GET] "https://stackoverflow.com/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

我找不到我在這裏失蹤。我知道我可以制定一個解決方法,但該鏈接應該能夠正常工作,直到現在,我想知道爲什麼它不是。

+0

應該有'POST'請求​​不是'DELETE'或'GET',因爲有些瀏覽器不支持'DELETE'方法 – hawk

+0

@hawk,你是對的,但是因爲它是一個鏈接,它只會'GET ',但由於'data-method =「delete」'部分,它應該自動更改爲'DELETE'。它在我的應用程序的其他地方工作 – RustyToms

+0

Rails會將'method::delete'擴展爲像這樣的內容''那麼只有在這之後你的服務器纔會以'DELETE'請求威脅你的請求不是瀏覽器。 – hawk

回答

1

當我讀通過jquery_ujs files我看到看來,它通過建立一個事件監聽器上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事件,由於我沒有使用任何其他點擊處理程序, st叫做$(document).off('click');,它刪除了正在收聽document上的點擊事件的所有內容。這顯然是一件非常糟糕的事情。我用那些專門刪除了我的點擊處理程序的東西替換了那條線,並且一切都恢復正常

的教訓是,如果你使用的是jQuery_ujs 永遠不要使用off()document除非你能針對特定處理器