Рельсы с магистральными рельсами: помощники ресурсов (image_path) в файлах EJS - PullRequest
12 голосов
/ 29 ноября 2011

У меня есть приложение 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?

Ответы [ 5 ]

25 голосов
/ 14 февраля 2012

На самом деле существует способ связать файл .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, нона данный момент, я не знаю, как это сделать.

16 голосов
/ 30 ноября 2011

Я вижу два пути.Ни то, ни другое не замечательно.

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

Если вы находите это слишком грубым ...

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

Так, например, assets.js.erb определяет что-то вроде:

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

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

5 голосов
/ 20 декабря 2011

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

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

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

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

4 голосов
/ 01 декабря 2011

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

2 голосов
/ 15 ноября 2013

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

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

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