URL-адреса динамических ресурсов на стороне клиента в конвейере ресурсов Rails 3.1 - PullRequest
3 голосов
/ 14 ноября 2011

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-адресов активов на стороне клиента, как этот?

1 Ответ

3 голосов
/ 09 декабря 2011

Одним из решений было бы иметь таблицу поиска для 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 для создания списка всех возможных путей, которые вам понадобятся во время компиляции ресурса, а затем выполните поискво время выполнения на клиенте.(и, конечно, вам понадобится сценарий с кофе - выше, я не кофейник, я предпочитаю латте.: -)

...