2013-05-05 27 views
0

我有一些簡單的javascript來隱藏和顯示我的網頁上的文本塊,以前工作正常。我最近在assets/javascripts中放置了一個新的JavaScript庫,以在我的網站上創建其他視覺效果。它工作正常,但現在我的簡單的JavaScript不再在線工作,雖然它仍然在本地工作。 Chrome控制檯顯示庫中的錯誤消息(「Uncaught ReferenceError:Raphael未定義」)。由於JS庫錯誤,JavaScript無法在Production Rails頁面上工作?

難道這是阻止我的JavaScript的其餘工作在生產服務器上,但不是在我的本地開發服務器上?我如何防止資產中的圖書館加載到其他頁面上,因此不會破壞所有內容?

回答

1

是的,這可能會打破你的其他代碼。當您在生產環境中運行rails時,如果您使用sprokets並將所有內容都放入application.js中,那麼它將全部處理爲單個文件。如果在該文件中的任何一點JavaScript代碼失敗,它將打破文件的其餘部分(這是非常討厭)

你可以有條件地包括拉斐爾圖書館,我認爲你已經這樣做的錯誤,但在你的JavaScript代碼中,你也可以檢查它是否被定義。我會做的就是圍繞這使得拉斐爾使用的代碼,把這樣的:

if (typeof Raphael !== "undefined") { 
    ... Raphael code goes here... 
} 

這樣,如果沒有加載庫,它並不重要,你的代碼不會打破,如果它被加載,那麼你的拉斐爾特定的代碼將運行正常:)

更多信息

我拉斐爾庫移動到供應商目錄中。它更有意義,因爲這是專門針對您自己未添加/創建的資產。

Rails現在自動加載Raphael的原因很可能是由於application.js的默認配置。默認情況下,軌道設置這個了

//= require_tree . 

這將包括資產目錄這是好的內的所有JS文件,但如果你想有條件包括文件這是一個稍微尷尬。

如果你希望它是基於每個頁面的條件,你可以改變你的application.html佈局來添加一個新的JS包含,它將包含raphael庫,只有當它被告知(通過變量或其他一些機制)

如果您添加類似:

<%= javascript_include_tag("raphael") if @raphael %> 

顯然改變拉斐爾對什麼庫文件的名稱實際上是,那麼將只有當@raphael變量是真有。這可以在任何地方設置,無論是在控制器中,還是在視圖的頂部,甚至可以在視圖中調用的視圖助手中設置。完全取決於你

+0

謝謝。我沒有在常規頁面上調用代碼,但我會檢查我正在使用的庫是否開始自行處理。 – 2013-05-05 20:56:18

+0

有沒有簡單的方法來防止Rails在不需要時自行加載資源? – 2013-05-05 20:56:54

+0

嗯,當你在Chrome中遇到錯誤時,它應該在JS中給你一條錯誤來自的線。 檢查你的application.js文件裏面。現在(至少默認)你可能有類似// = require_tree的東西。 如果你這樣做,那麼它會自動在assets目錄中包含EVERY JS文件。我建議將raphael庫移動到'/ vendor/assets/javascripts'中,因爲它無論如何都是外部庫。然後,您可以將其包含在有條件的任何頁面中。因此,在application.html中,您可以使用類似於 'javascript_include_tag(「raphael」)if @ raphael' – PaReeOhNos 2013-05-05 20:59:50

相關問題