2011-11-14 156 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构建所有订单列表在资产编译时需要可用的路径,然后在客户端运行时进行查找。 (当然,你需要咖啡脚本 - 上述 - 我不是咖啡的人,我更喜欢拿铁的。:-)