2010-11-20 97 views
33

我有一個奇怪的問題,其中JQuery爲link_to方法創建兩個AJAX請求。我正在開發一個帶有JQuery for UJS的Rails 3應用程序。我有一個「請」和「取消關注」Rails 3 UJS - 控制器被link_to調用兩次:remote

我的鏈接呈現如下之間切換肘杆:

<span id="follow_link"> 
    <a href="/tfollow_artist?id=8103103" data-method="post" data-remote="true" id="follow_artist" rel="nofollow">Unfollow</a> 
</span> 

和我的控制器設置,以便:

def tfollow_artist 
    @artist = Artist.find(params[:id]) 
    if current_user.following?(@artist) 
    current_user.stop_following(@artist) 
    else 
    current_user.follow(@artist) 
    end 
end 

並最終呈現a js如下:

$('#follow_link').html('<%= escape_javascript(render :partial => "follow") %>'); 

這實質上取代了'的html內容span id =「follow_link」> ... </span >僅具有相同的URL且文本不同。例如,上面現在將呈現爲:

<span id="follow_link"> 
    <a href="/tfollow_artist?id=8103103" data-method="post" data-remote="true" id="follow_artist" rel="nofollow">Follow</a> 
</span> 

但是,這在某種程度上導致JQuery發出兩個AJAX請求。

任何人都可以看到這裏有什麼問題嗎?

我正在使用'jquery-rails'gem,它將最新的jquery-ujs文件複製到我的應用程序中。 JQuery版本是1.4.3

+0

即使即時通訊面臨這個錯誤..任何解決方案? – Anand 2011-03-23 08:28:21

+0

這裏同樣的問題。仍在尋找解決方案。 – 2011-09-13 07:29:56

+0

同上這個問題..你有沒有想過這個呢? – noli 2011-09-14 01:53:24

回答

3

我認爲發生的事情是你的JavaScript沒有阻止鏈接被瀏覽器執行。所以你得到了AJAX請求,然後是瀏覽器請求。

在Rails Cast 174.中有對此的解釋和解決方案。文本說明here,大約3/4的頁面向下。

+0

感謝您的鏈接和解釋。這是有道理的。但是,調用link_to:remote時調用遠程調用的Javascript已經使用「live」方法和「防止」默認值(這是在jquery-ujs的rails.js中(https://github.com/rails/jquery- $('a [data-remote],input [data-remote]')。live('click.rails',function(e){('ajax/raw/master/src/rails.js): $這一點).callRemote(); e.preventDefault(); }); 所以不知道是否有別的東西這是怎麼回事 – chandru 2010-11-22 07:16:40

+0

沒有它依賴於返回值,而不是 – 2011-11-02 09:40:50

+0

解決我的問題是?以及 – 2012-02-20 11:45:24

26

由於此對話框:

https://github.com/rails/jquery-ujs/issues/208

我能發現jQuery和都拿到包含兩次jquery_ujs。

我猜jquery-rails gem會自動將它們放入application.js中,然後我將它們也包含在application.js中。

似乎無論出於何種原因,application.js自動捆綁app/assets/javascripts /中的所有內容 - 即使我刪除了全部的要求。

因此,如果您的:remote => true表單獲得兩次提交,請嘗試檢查application.js。

希望這會有所幫助!

更新:我相信這可能與我在不使用摘要的情況下預渲染我的資產有關,因此當我的開發環境動態地從app/assets/application中的require添加腳本標記到html頭時.js,它還爲應該是一個空的動態application.js添加了一個,除了public/assets中的靜態的被加載。混亂?是的!

+0

謝謝,它的工作原理:-) – Arkan 2012-03-31 21:02:08

+0

這解決了我的問題..謝謝..! – 2015-05-24 14:17:46

17

我有同樣的問題,在發展方式評論這條線

\#config.assets.debug = true 

你作爲要

+1

這對我很有用,並且重複的ajax調用被取消了,但由於某種原因,我不需要在我的其他工作站上執行此操作。這個設置是做什麼的,爲什麼我們需要打開/關閉它,何時使用它? – Homan 2012-03-18 05:00:27

+1

這仍然有效。任何人都知道他/她的頭頂*爲什麼*? – polarblau 2012-07-05 10:20:49

+0

在我的設置中工作 – 2017-09-27 17:36:13

0

JavaScript文件固定:默認值(application.js中總是包含)。

config.action_view.javascript_expansions[:defaults] = %w(jquery rails) 

註釋行明確指出application.js始終包含在內。 在我的應用程序中,我添加了默認應用程序。因此,對於ajax .submit,它在我的應用程序中創建了兩條記錄。

1

試試這個代碼....防止遠程鏈接雙擊..

$('a[data-remote=true]').live('ajax:before', function() { 
    if ($(this).attr('ajax-loading')) { 
    return false; 
    } else { 
    $(this).attr('ajax-loading', true); 
    } 
}).live('ajax:complete', function() { 
    $(this).removeAttr('ajax-loading'); 
}); 

Gist

2

我有同樣的問題:當使用重複的請求:遠程=>真。我的問題是由於使用Heroku和預編譯資產。我在部署到Heroku之前預編譯資產(rake資產:預編譯)。這本質上是在公用文件夾中創建資產管道的副本。正如Docunext所提到的那樣,發生了同樣的事情:有多個JavaScript文件處理每個請求。

如果我在本地工作時刪除公共目錄中的資產(git rm -rf public/assets),它就會被修復。從公共目錄刪除資產後,它停止發送多個請求

0

我剛纔面臨同樣的問題。檢查了所有的代碼更改並嘗試其他的東西,但無濟於事。終於清除了瀏覽器緩存。這有幫助。

5

我有simmilar問題。運行下面的rake任務解決了我的問題。

rake tmp:clear 
rake assets:clean 
0

如果您在UJS文件被加載兩次,簡單地複製這些代碼到rails.js/application.js中(最好不要在這裏)

var alreadyInitialized = function() { 
    var events = $(document).data('events'); 
    return events.click && $.grep(events.click, function(e) { return e.namespace === 'rails'; }).length; 
    } 

if (alreadyInitialized()) { 
    $.error('jquery-ujs has already been loaded!'); 
} 
0

大廈尤金無法找到答案請注意,如果您在本地預編譯你的資產進行生產,等之後你正在開發...

bundle exec rake assets:precompile RAILS_ENV=production 

...然後你繼續發展Rails的AssetPipeline將要服務均爲您未編譯的您的編譯資產。

解決這個問題的一種方法是使用Eugene的Rails的標準rake任務。另一種方式是通過簡單的東西,如

$ rm -rf #{Rails.root}/public/assets 
1

對我來說也是同樣的問題,消除這些討厭的預編譯的生產就緒型資產:兩次的XMLHttpRequest上 的link_to ...:遠程=>「真」

我已經解決了,在

當地人/應用程序。RB

通過註釋

// config.assets.paths < < Rails.root.join( '供應商', '資產', '樣式表', 'Java腳本')

並取消

config.action_view.javascript_expansions [:默認值] =%(重量)(jquery的jQuery的UI應用程序)

然後我忘了在我最後的git pull之後做。 我希望能幫助別人。