Избегайте файлов * .js.erb, создав все значения asset_path - PullRequest
17 голосов
/ 15 декабря 2011

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

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

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

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

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

Я, безусловно, могу сделать это БЕСПЛАТНО, взяв его заby-case:

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?.

Ответы [ 3 ]

6 голосов
/ 16 декабря 2011

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

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

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

  3. Сделайте assetPath, просто добавив URL-адрес приложения + префикс к имени изображения или отпечатку пальца

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

1 голос
/ 02 ноября 2015

Старый вопрос, но есть хороший способ сделать это. Просто для объяснения контекста моего решения: мне нужно отобразить маркеры на карте, которые имеют различные возможные значки на основе динамических переменных 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, из которой я основал свою.

1 голос
/ 18 января 2013

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

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

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

Тогда я бы работал с классами в сценарии Java, а не с изображениями.

   $.addClass('spinner')

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

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

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

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

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

...