Rails with backbone-rails: helpery zasobów (ścieżka obrazu) w plikach EJS

Mam aplikację Rails 3.1, która używa codebrew / backbone-rails . W a .jst.szablon ejs, chciałbym dołączyć obrazek, Tak:

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

Ale oczywiście helpery zasobów nie są dostępne w JavaScript.

Łańcuchowanie ERB (.jst.ejs.erb) nie działa, ponieważ składnia EJS koliduje z ERB.

Oto co wiem:

  • helpery zasobów nie są dostępne w przeglądarce, więc muszę je uruchomić po stronie serwera.
  • I can work problem polega na tym, że serwer zrzuca różne ścieżki zasobów do HTML (poprzez atrybuty danych lub <script> i JSON) i odczytuje je z powrotem w JS, ale wydaje się to dość kłopotliwe.

Czy jest jakiś sposób na wykorzystanie helperów zasobów w plikach EJS?

Author: Jo Liss, 2011-11-29

5 answers

Jest sposób na łańcuch A.jst.ejs.plik erb, chociaż jest dość nieudokumentowany, i znalazłem go tylko poprzez przeglądanie spraw testowych EJS. Możesz powiedzieć EJS, aby używał {{ }} (lub [ % % ] lub czegokolwiek innego, co chcesz) zamiast, a ERB nie będzie próbował Oceniać Twoich połączeń EJS.

Upewnij się, że gdzieś w Twoim kodzie wymagany jest EJS (właśnie włączyłem gem 'ejs' do mojego Gemfile), a następnie utwórz inicjalizator (nazwałem go ejs.rb), który obejmuje:

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

Wtedy po prostu upewnij się, że zmienisz nazwy szablonów na .jst.ejs.erb i zastąp istniejący kod EJS interpretowany przez {{ }}. Jeśli chcesz użyć czegoś innego niż {{ }}, Zmień wyrażenia regularne w inicjalizatorze.

Szkoda, że nie ma opcji w Sprockets, aby poradzić sobie z tym poprzez config, a nie muszą wyraźnie zawierać EJS, ale na razie, nie ma sposobu, aby to zrobić, że wiem o.

 25
Author: carpeliam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-14 19:12:16

Widzę dwa sposoby. Ani świetne.

Kiedy mówisz <%%= variable %> to jest to renderowane przez ERB jako <%= variable %>, więc możesz dwukrotnie uciec od wszystkiego , ale asset_tags i to przetrwałoby podróż przez jeden ERB pass w drodze do EJS.

Jeśli uznasz to za obrzydliwe...

Co powiesz na utworzenie innego pliku javascript z rozszerzeniem ERB, który definiuje ścieżki zasobów? A następnie użyj potoku zasobów, aby tego wymagać.

Więc powiedz assets.js.erb definiuje coś w stylu:

MyAssets = {
  'foo': <%= image_path("foo.png") %>,
  ...
}
A potem Zażądaj tego gdzieś w górnej części listy. A potem odwołaj się do globali, które działają w EJS.
 16
Author: maxl0rd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-29 20:35:11

Dla tych, którzy chcą spróbować HAML zamiast EJS: używanie haml-coffee przez haml_coffee_assets również dobrze mi poszło.

Możesz mieć następujące w .hamlc.plik erb:

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

(nadal nie daje Ci jednak pomocników routingu, tylko pomocników zasobów.)

 5
Author: Jo Liss,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-11 18:48:49

Ryan Fitzgerald był na tyle uprzejmy, aby opublikować gist jego JavaScript asset helpers (które zostały wstępnie skompilowane z ERB): https://gist.github.com/1406349

 4
Author: Jo Liss,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-30 21:22:24

Możesz użyć odpowiedniego Helpera Javascript za pomocą następującego klejnotu: https://github.com/kavkaz/js_assets

Wreszcie (po zainstalowaniu i skonfigurowaniu) będziesz mógł go używać w następujący sposób:

<img src="<%= asset_path("foo.png") %>"/>
 2
Author: wik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-15 12:04:47