2015-11-02 49 views
0

工作。例如,我的routes.rb樣子:自定義路線不setTimeout的

... 
get 'abc/xyz' => 'abc#xyz', :as => 'abc_xyz' 
... 

的application.js:

... 
$('a').click(showSpinner); 
function showSpinner(evt) { 
    link = $(this); 
    evt.preventDefault(); 
    $('body').append('<div class="spinner-overlay"></div>'); 
    setTimeout(function() { 
     window.location = link.attr('href'); 
    }, 10); 
}); 
... 

當使用了JavaScript去abc_xyz_path,它的鏈接因爲它正在查找ID爲xyz而不是使用自定義路由的abc記錄,因此會出現ActiveRecord RecordNotFound錯誤。但是,如果我刪除setTimeout,則沒有問題,並且可以工作。 Rails的路由系統有超時問題嗎?

UPDATE:

我意識到,我並不需要的preventDefault()或setTimeout的(),因爲這個點擊處理程序將反正重定向鏈接之前發生。問題解決了。

+0

'link.attr('href');'從某處獲得href。這個href一定是錯誤的 - 請在html代碼片段中找到它的href,粘貼生成該html代碼的代碼,並粘貼最終從'link.attr('href')'獲得的值。 如果您只需手動點擊鏈接,它是否工作? Rails不會在乎你的超時,所以這不應該是問題。 –

+0

它從.html.erb文件獲取href,就像任何其他'link_to'一樣。當我點擊鏈接時JS會被調用(請參閱我的編輯)。當我刪除點擊處理程序時,它工作得很好。 – BalinKingOfMoria

回答

0

我意識到我不需要preventDefault()或setTimeout(),因爲這個點擊處理程序會在鏈接重定向之前發生。沒有更多的問題。

0

事實上,您的鏈接工作沒有JavaScript表明它指向正確的URL。在JavaScript超時之後,Rails不會知道或關心請求是否發生,所以這不是問題。

那麼,問題是,你行:

window.location = link.attr('href'); 

必須設置錯誤的URL。你應該這樣做:

檢查它是什麼,並更新你的問題。我不知道什麼是link,但根據您的代碼示例,它不超過該行提到的其他window.location = link.attr('href');

我會做的反而是:

window.location = $(this).attr('href'); 

$(this)將指認爲剛剛收到點擊事件,這是你想要的。

+0

link = $(this)(我相應地更新了問題)。對於那個很抱歉! – BalinKingOfMoria

+0

在window.location = link.attr('href');,之前做一個console.log(link.attr('href'));然後用輸出更新你的問題。 –