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?