Подтвердить что ты не робот

Рельсы с опорными рельсами: помощники ресурсов (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?

4b9b3361

Ответ 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") %>"/>