TL; DR
Я пытаюсь динамически генерировать URL ресурса с использованием элементов данных HTML5 на стороне клиента. Это означает, что имя ресурса недоступно до времени выполнения в браузере, что препятствует предварительной обработке ERB на сервере.
Есть ли обходной путь или лучшая практика для решения такой ситуации?
Фон
Я использую плагин 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 %>">
Затем у меня есть простой плагин jQuery, написанный на CoffeeScript, который перетягивает эти атрибуты данных и связывает их с 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 , я должен использовать помощник asset_path
в ERB, но это не сработает, потому что 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-адресов активов на стороне клиента, как этот?