Рельсы с опорными рельсами: помощники ресурсов (image_path) в файлах EJS
У меня есть приложение Rails 3.1, которое использует codebrew/backbone-rails. В шаблоне .jst.ejs я хотел бы включить изображение, например:
<img src="<%= image_path("foo.png") %>"/>
Но, конечно, помощники по активам недоступны в JavaScript.
Цепочка ERB (.jst.ejs.erb) не работает, потому что синтаксис EJS конфликтует с ERB.
Вот что я знаю:
- Помощники по активам недоступны в браузере, поэтому мне нужно запустить их на стороне сервера.
- Я могу обойти эту проблему, заставив сервер сбрасывать различные пути активов в HTML (через атрибуты данных или
<script>
и JSON) и считывая их обратно в JS, но это кажется довольно клонированным.
Есть ли способ каким-то образом использовать помощники активов в файлах EJS?
Ответы
Ответ 1
На самом деле существует способ связать файл .jst.ejs.erb, хотя он довольно не документирован, и я только нашел его, просмотрев тестовые примеры EJS. Вы можете указать EJS использовать {{}} (или [%%] или все, что захотите) вместо <%% > , а затем ERB не будет пытаться оценить ваши вызовы EJS.
Обязательно требуйте EJS где-то в вашем коде (я просто включил gem 'ejs'
в свой Gemfile), а затем создаю инициализатор (я его назвал ejs.rb), который включает в себя следующее:
EJS.evaluation_pattern = /\{\{([\s\S]+?)\}\}/
EJS.interpolation_pattern = /\{\{=([\s\S]+?)\}\}/
Затем просто переименуйте свои шаблоны в .jst.ejs.erb и замените существующий <%% > EJS-интерпретированный код на {{}}. Если вы хотите использовать что-то другое, кроме {{}}, измените регулярные выражения в инициализаторе.
Мне жаль, что в Sprockets не было возможности справиться с этим через конфигурацию, вместо того, чтобы явно включать EJS, но на данный момент нет способа сделать это, о котором я знаю.
Ответ 2
Я вижу два пути. Ничего хорошего.
Когда вы говорите <%%= variable %>
, то это ERB отображается как <%= variable %>
, поэтому вы можете удвоить процент, чтобы избежать всего, кроме активов_tags, и это выдержит поездку через один проход ERB на пути к EJS.
Если вы обнаружите, что слишком важен...
Как создать другой файл javascript с расширением ERB, который определяет пути вашего ресурса? И затем используйте конвейер активов, чтобы потребовать этого.
Значит, assets.js.erb
определяет что-то вроде:
MyAssets = {
'foo': <%= image_path("foo.png") %>,
...
}
И затем попросите это где-то рядом с верхней частью вашего манифеста. А затем ссылайтесь на глобальные глобальные переменные, однако это работает в EJS.
Ответ 3
Для тех, кто хочет попробовать HAML вместо EJS: используя haml-coffee через haml_coffee_assets, хорошо работал и для меня.
В файле .hamlc.erb может быть следующее:
%img(src="<%= image_path('foo.png') %>")
(Он по-прежнему не дает вам помощников маршрутизации, но только помощников по активам.)
Ответ 4
Райан Фитцджеральд был достаточно любезен, чтобы опубликовать суть своих помощников по активам JavaScript (которые предварительно скомпилированы с ERB): https://gist.github.com/1406349
Ответ 5
Вы можете использовать соответствующий помощник Javascript через следующий камень:
https://github.com/kavkaz/js_assets
Наконец (после установки и настройки) вы сможете использовать его следующим образом:
<img src="<%= asset_path("foo.png") %>"/>