2011-11-14 223 views
3

TL; DR

我試圖在客戶端使用HTML5數據元素動態生成資產URL。這意味着資產名稱在瀏覽器運行時纔可用,這樣可以防止ERB在服務器上進行預處理。Rails 3.1資產管道中的客戶端動態資產URL

處理這種情況是否存在變通或最佳做法?

背景

我使用Fusion Charts圖表插件在Rails應用程序,它使用不同的SWF文件來生成圖表。我正在將應用程序升級到Rails 3.1,並將這些SWF文件放入/vendor/assets/javascripts/fusion_charts

在該應用程序,我動態指定圖表的類型使用HTML5數據屬性來繪製,像這樣:

<%# ... metric.html.erb ... %> 
<div id='chart-container' class='fusion-chart' 
    data-chart-type='MSLine' 
    data-source-url="<%= @metric.data_url %>"> 

然後,我必須寫在CoffeeScript的一個簡單的jQuery插件,拉動這些數據屬性和電線的東西到Fusion Charts:

// ... charting_plugin.js.coffee ... 
chart = new FusionCharts 
    swfUrl: "/assets/fusion_charts/#{data.chartType}.swf" 
chart.setJSONUrl data.sourceUrl 
chart.render containerId 

我遇到的問題是swfUrl參數。要遵循RoR Asset Pipeline guide中提供的指導,我應該在ERB中使用asset_path幫助程序,但這不起作用,因爲data.chartType在運行時綁定在客戶端上,並且無法在服務器端進行預處理。

<# ... charting_plugin.js.coffee.erb: This won't work; data.chartType isn't defined ... %> 
chart = new FusionCharts 
    swfUrl: "<%= asset_path "fusion_charts/#{data.chartType}.swf" %>" 
chart.setJSONUrl data.sourceUrl 
chart.render containerId 

變通

最簡單的變通(我使用的是目前的一個)是簡單地移動SWF文件放回/public/fusion_charts而不用擔心管道的資產指紋識別的複雜性。這就是說,我是新來的管道,所以也許我錯過了一些明顯的東西。

有沒有更好的方式來處理這樣的客戶端資產URL?

回答

3

一個解決辦法是通過圖表類型有SWF文件的查找表,例如:

var chartMap = { 
<% 
chart_types.collect do |type| 
    "#{type.to_json}: #{asset_path(type + '.swf')}" 
end.join(",\n") 
%> 
}; 

在運行時再加入一個函數來獲取客戶端上的正確路徑,像這樣:

function chartPath(type) { 
    return chartMap[type]; 
}; 

然後更改您建立呼叫是:

chart = new FusionCharts 
    swfUrl: chartPath(data.chartType) 

IE,使用ERB構建所有訂單列表在資產編譯時需要可用的路徑,然後在客戶端運行時進行查找。 (當然,你需要咖啡腳本 - 上述 - 我不是咖啡的人,我更喜歡拿鐵的。:-)