Избегайте файлов *.js.erb, создавая все значения параметра asset_path

Поэтому я хочу избежать обработки файлов JavaScript с помощью ERB, чтобы я мог получить правильный путь к файлу, скажем, к изображению.

В настоящее время это похоже на популярный подход:

var myImage = "<%= asset_path('my_image') %>";

Что, конечно, требует, чтобы имя файла было изменено на "*.erb", чтобы оно было обработано.

Я бы предпочел изолировать уродство ERB до одной точки моего проекта, создав единый файл манифеста (скажем, "assets.js.erb" ), который вычисляет и предоставляет все пути к ресурсам, которые мне нужны для JavaScript.

Я могу, конечно, сделать это МОЖНО, разрешив его в каждом конкретном случае:

ASSETS =
  "my_image": "<%= asset_path('my_image') %>"

window.assetPath = (path) -> ASSETS[path]

Но я бы предпочел просто написать некоторую ERB, чтобы перезаписать весь мой asset_paths.asset_environment.paths и построить для меня большой манифест для объектного объекта, так что мой реальный JavaScript приложения может уверенно вызвать:

var myImage = assetPath('my_image');

Любые идеи по (1), если есть более простой способ сделать это, который я пропустил, или (2) как я выполнил бы поиск всех возможных аргументов в asset_path?.

Ответы

Ответ 1

Более простой способ:

  • Получите префикс активов в вашем .js.erb: <% = Rails.configuration.assets.prefix% > . Если необходим абсолютный путь, вы также можете получить URL-адрес приложения (сложнее получить его из рельсов, поэтому вы можете просто записать его в свой .js.erb?)

  • Если вы работаете с прекомпилированными активами, получите отпечаток вашего файла, который хранится в manifest.yml (at <% = Rails.configuration.assets.manifest% > ), В манифесте содержится список всех ваших активов и соответствующих отпечатков пальцев (документация)

  • Сделать свойство активом только приложением URL + префикса приложения к имени вашего изображения или отпечатку пальца

Неудобно то, что вы должны указать полное имя изображения (включая расширение).

Ответ 2

Это зависит от контекста использования этого изображения.

Используйте случай 1: изображение является декоративным и должно быть динамически заменено. Пример: Spinner, в то время как данные загружаются. В этом случае я ссылаюсь на мой sass и java script.

.spinner
   background-image: url(image_path("spinner.png"))

Тогда я буду работать с классами в java script, а не с изображениями.

   $.addClass('spinner')

Пример использования 2: Изображение является частью объекта.

Существует много ситуаций, когда изображение действительно принадлежит объекту. В этом случае я создаю json файл, в котором хранятся данные и ссылка на изображение как это. Затем я использую erb для разворачивания ссылки на изображение - my_object.json.erb:

 {
    "icon" : "<%=image_path("icons/my_icon.png")%>",
    "label":"My label",
    "description":"My description"
 }

Использование case 2 требует больше работы с javascript для загрузки json файлов, но открывает очень мощные возможности расширения.

Конвейер активов отлично справляется с обоими случаями.

Ответ 3

Старый вопрос, но есть хороший способ сделать это. Чтобы объяснить контекст моего решения: мне нужно отображать маркеры на карте, которые имеют разные значки, основанные на динамических переменных JS. Как ни странно, использование параметра <% = asset_path ('+ somefunction (raw_value) + "')% > не работает. Затем я искал решение ниже.

Конкретно, решение, которое я использую, имеет только один файл js.erb, в котором хранятся значения изображений и их имена с отпечатками пальцев, которые можно получить функцией, image_path. После этого все мои другие JS файлы могут быть свободны от asset_path и, следовательно, .erb

Создайте файл images.js.erb в your_application/app/assets/javascripts со следующим содержимым:

<%
    imgs = {}
    Dir.chdir("#{Rails.root}/app/assets/images/") do
        imgs = Dir["**"].inject({}) {|h,f| h.merge! f => image_path(f)}
    end
%>

window.image_path = function(name) {
    return <%= imgs.to_json %>[name];
};

Требовать этот файл в application.js, который обычно находится в том же каталоге, что и выше:

//= require ...
//= require ...
//= require images
//= require_tree .

Затем внутри JS, который вы использовали <%= asset_path('image.png') %>, вместо этого вы будете использовать image_path('image.png');

Кредиты на это сообщение в блоге для публикации версии Coffee script, из которой я основал мой.