2011-11-29 3 views
12

У меня есть приложение Rails 3.1, которое использует codebrew/backbone-rails. В .jst.ejs шаблона, я хотел бы включить изображение, например, так:Рельсы с опорными рельсами: помощники активов (image_path) в файлах EJS

<img src="<%= image_path("foo.png") %>"/> 

Но конечно помощники активов не доступны в JavaScript.

Цепочный ERB (.jst.ejs.erb) не работает, поскольку синтаксис EJS конфликтует с ERB.

Вот что я знаю:

  • Помощники активы не доступны в браузере, так что мне нужно, чтобы запустить их на стороне сервера.
  • Я могу обойти проблему, заставив сервер выгружать различные пути активов в HTML (через атрибуты данных или <script> и JSON) и считывая их обратно в JS, но это кажется довольно глупым.

Есть ли способ каким-либо образом использовать помощники активов в файлах EJS?

+0

Вы можете также переопределить EJS (если они действительно являются портом функции шаблонов Underscore, как предложено в документах ruby-ejs gem) с '_.templateSettings' [функция шаблона underscore.js] (http://documentcloud.github.com/underscore/#template), что позволяет вам использовать '{{code}}' или некоторые другие теги по вашему выбору – wulftone

ответ

25

Существует способ, на самом деле, чтобы связать файл .jst.ejs.erb, хотя он довольно недокументирован, и я нашел его только через просмотр тестовых примеров EJS. Вы можете сказать EJS использовать {{}} (или [%%] или все, что вы хотите) вместо <%%>, а затем ERB не будет пытаться оценить ваши вызовы EJS.

Обязательно требуйте EJS где-то в вашем коде (я только что включил gem 'ejs' в свой Gemfile), а затем создаю инициализатор (я назвал его ejs.Р.Б.), который включает в себя следующее:

EJS.evaluation_pattern = /\{\{([\s\S]+?)\}\}/ 
EJS.interpolation_pattern = /\{\{=([\s\S]+?)\}\}/ 

Тогда просто убедитесь, что переименовать шаблоны .jst.ejs.erb и заменить существующий <%%> EJS-интерпретируемый код {{}}. Если вы хотите использовать что-то другое, кроме {{}}, измените регулярные выражения в инициализаторе.

Мне жаль, что в Sprockets не было возможности использовать это через конфигурацию, вместо того чтобы явно включать EJS, но на данный момент я не знаю, как это сделать.

+0

Это ТОЧНО, что я искал. Большое спасибо за сообщение :) – Kirk

+0

hmm это не работает для меня, да, я перезапустил рельсы. он просто игнорирует опцию и продолжает работать с оценкой/интерполяцией по умолчанию – zanedev

+0

@zanedev, где вы положили эту опцию? вы можете создать суть? – carpeliam

16

Я вижу два пути. Ничто не здорово.

Когда вы говорите <%%= variable %> то это вынесенное Еврорадио, как <%= variable %>, так что вы могли бы удвоить процент избежать все, но в asset_tags и что бы пережить поездку через один Еврорадио проходят на пути к EJS.

Если вы обнаружили, что слишком полная ...

Как о создании другого файла JavaScript, с расширением ERB, который определяет пути активов? И затем используйте конвейер активов, чтобы потребовать это.

Так говорят assets.js.erb определяет что-то вроде:

MyAssets = { 
    'foo': <%= image_path("foo.png") %>, 
    ... 
} 

А потом требуют это где-то в верхней части манифеста. А затем ссылайтесь на глобальные глобальные группы, которые работают в EJS.

+0

лучший вариант до сих пор MyAssets, для него (также для i18n) – mateusmaso

4

Райан Фицджеральд был достаточно любезен, чтобы опубликовать суть его помощникам активов JavaScript (которые получают прекомпилирована с Еврорадио): https://gist.github.com/1406349

+0

Это отличная идея. Спасибо за публикацию. – maxl0rd

+0

Этот гранж является удивительным. Вот моя упрощенная вилка: https://gist.github.com/3879730 –

5

Для тех, кто хочет попробовать HAML вместо EJS: Использование haml-coffee через haml_coffee_assets работал хорошо для меня также.

Вы можете иметь следующее в файле .hamlc.erb:

%img(src="<%= image_path('foo.png') %>") 

(. Он по-прежнему не дает вам маршрутизации помощников, хотя, только помощникам активов)

+0

отлично, спасибо – Hannes

2

Вы можете использовать соответствующие вспомогательные Javascript с помощью следующей самоцвета: https://github.com/kavkaz/js_assets

Наконец (после установки и настройки), вы будете иметь возможность использовать его как это:

<img src="<%= asset_path("foo.png") %>"/> 
Смежные вопросы