Рельсы с магистраль
-
25-10-2019 - |
Вопрос
У меня есть приложение 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, но это кажется довольно Kludgy.
Есть ли способ каким -то образом использовать помощников активов в файлах EJS?
Решение
На самом деле есть способ цеповать файл. Вы можете сказать EJS использовать {{}} (или [ % %] или что -то еще, что вы хотите) вместо < % %>, а затем ERB не попытается оценить ваши вызовы EJS.
Обязательно требуют EJ где -то в вашем коде (я только что включил gem 'ejs'
В моем Gemfile), а затем создайте инициализатор (я назвал его ejs.rb), который включает в себя следующее:
EJS.evaluation_pattern = /\{\{([\s\S]+?)\}\}/
EJS.interpolation_pattern = /\{\{=([\s\S]+?)\}\}/
Затем просто убедитесь, что переименуйте свои шаблоны в. Если вы хотите использовать что -то другое, кроме {{}}, измените регулярные выражения в инициализаторе.
Я хотел бы, чтобы в Sprockets была возможность обрабатывать это через конфигурацию, а не явно включать EJS, но на данный момент нет никакого способа сделать это, о котором я знаю.
Другие советы
Я вижу два способа. Ни один из них не отлично.
Когда ты говоришь <%%= variable %>
тогда это отображается Эрб как <%= variable %>
, так что вы могли бы удвоить процент избежать всего но Asset_tags, и это выживет в поездке через один проход ERB по дороге к EJS.
Если вы найдете это слишком грубым ...
Как насчет того, чтобы сделать другой файл JavaScript с расширением ERB, который определяет ваши пути активов? А затем используйте конвейер активов, чтобы потребовать этого.
Так скажи assets.js.erb
Определяет что -то вроде:
MyAssets = {
'foo': <%= image_path("foo.png") %>,
...
}
А затем потребуется это где -то на вершине вашего манифеста. А затем ссылайся на глобалов, однако, что работает в EJS.
Для тех, кто хочет попробовать HAML, а не EJS: Использование Хэмл-коффи через haml_coffee_assets хорошо работал и для меня.
Вы можете иметь следующее в файле .hamlc.erb:
%img(src="<%= image_path('foo.png') %>")
(Это все еще не дает вам помощников по маршрутизации, только помощники активов.)
Райан Фицджеральд был достаточно любезен, чтобы опубликовать суть своих помощников актива JavaScript (которые предварительно скомпилируются ERB): https://gist.github.com/1406349
Вы можете использовать соответствующего помощника JavaScript через следующий драгоценный камень:https://github.com/kavkaz/js_assets
Наконец (после установки и настройки) вы сможете использовать его так:
<img src="<%= asset_path("foo.png") %>"/>