2010-08-02 104 views
3

在Rails中使用JavaScript文件的模塊化系統時 - 基本上每個視圖都將在.js文件中擁有自己的模塊。當我需要一個動態的Rails生成的字符串時,我的問題就出現在我的JavaScript中,例如翻譯字符串和URL。Ruby on Rails with Unobtrusive JavaScript - 管理URL

使用babilu可以很好地解決翻譯問題,但我仍然堅持生成網址。我可以編寫一些在應用程序中查看路由的東西,並生成JavaScript方法,我可以傳遞諸如對象ID之類的東西。

另一種方法是將已生成的URL傳遞給我所調用的任何函數,這聽起來很亂,但可能是最靈活的選擇。

+0

我正要發佈類似的問題。這是我沒有真正瞭解不顯眼javascript的一件事。這似乎使得混合ruby和JS變得更加困難,因爲如果你在ruby塊中並且有權訪問你想在JS中使用的變量,那麼如果你把JS移動到一個單獨的文件中,你將失去對這些變量的訪問。 – 2010-08-16 22:29:54

回答

3

我不知道有什麼真正令人愉快的方式來做到這一點,但有一種可能性是讓您的服務器端代碼在頁面中寫入一個小的<script>塊來聲明您打包的Javascript可以發現和使用的一些變量。

<script> 
    var pageGlobals = { 
    interestingURL: <% ... url %>, 
    ... 
    }; 
</script> 

我已經完成了這項工作,以跟蹤由客戶「辛迪加」聯盟確定的圖像子目錄等內容。 Javascript代碼只是知道,只要它需要一個URL,它就可以查看全局對象並挑選出一個標準化變量。

根據我的經驗,通常只有少數這樣的事情要與罐裝Javascript通信,所以<script>塊往往不會失去控制。我已經將我埋在頁面模板中,所以我甚至不必用新頁面來思考它。

+0

是的,我想到了這一點,這就是我在原評論中說「生成JavaScript方法」時的意思,我想到了類似於: 2010-08-02 16:21:22

0

我也不喜歡這個。對我來說理想的解決方案將是JavaScript模板。想象一下,在js文件,你可以這樣做:

var users_path = '<%= users_path %>'; 

但是,這將意味着.js文件將在每一個請求重新生成(當然,人們可以使用緩存就像使用Rails HTML)。

無論如何,你也可以做的是把動態的東西放在數據屬性中。所以你可以做例如

<%= select_tag :select_something, select_options, 'data-url' => users_url %> 

然後在JavaScript文件中讀取該屬性。我比較喜歡Pointy提出的解決方案。

編輯:實際上有人實現了動態.js文件的想法。看起來很簡單,只需創建一個javascripts控制器並通過javascript_include_tag鏈接到其操作:dynamic javascript files

3

老舊的問題,但這裏有另一種方法。 HTML 5規範允許定製數據屬性。

在你看來:

<button id="myButton" data-url="<%= my_resource_path %>">Click me</button> 

然後在打包的JS:

var myurl = $("#myButton").data("url"); 

here也。