2011-01-17 12 views
5

Buduję aplikację javascript-heavy rails 3. Używa on underscore.js, który ma bardzo elegancki mechanizm szablonowy zbudowany na bazie ejs (http://embeddedjs.com/).Osadzanie szablonu ejs wewnątrz szablonu erb

Problem: embeddedjs dużo zapożycza ze składni erb, więc uwzględnienie szablonów ejs w szablonie erb powoduje problemy z renderowaniem z widokiem.

Czy istnieje sposób włączenia sekcji "nie erb" do pliku erb? To pozwoliłoby mi zdefiniować szablony ejs wewnątrz plików erb. Teraz używam hacka, w którym mam pomocnika, który czyta surową zawartość pliku zawierającego szablony ejs i wyprowadza go jako nieprzetworzony ciąg w szablonie erb.

+1

W haml byłoby to łatwe dzięki filtrowi ': plain'. http://haml-lang.com/docs/yardoc/file.HAML_REFERENCE.html#plain-filter – Heikki

Odpowiedz

3

używam tej sztuczki, aby rozwiązać problem:

// Using custom tags to be able to use regular for templates in templates 
var ejs = require('ejs'); 
ejs.open = '{{'; 
ejs.close = '}}'; 

// Using html extension for custom ejs tags 
app.register('.html', ejs); 

app.set('views', __dirname + '/views'); 
app.set('view engine', 'html'); 

zmienia <%%> do {{}}, i niech mi używać <%%> do szablonów, które są wykorzystywane przez JS. Działa to dla mnie, ponieważ nie mam szablonów w stylu klasycznym (<%%>).

Jeśli masz dużo takich, możesz wykonać tę samą sztuczkę, ale w przypadku szablonów underscore.js.

+0

Dokładnie tego chcę, ale nie jestem pewien, jak powiązać to z Railsami. (Nie używam podkreślenia, tylko EJS i JST.) – carpeliam

+0

Właśnie znalazłem rozwiązanie mojego problemu - przypisz EJS.evaluation_pattern do/\ {\ {([\ s \ S] +?) \} \}/I EJS .interpolation_pattern do/\ {\ {= ([\ s \ S] +?) \} \}/w inicjatorze. – carpeliam

2

Można zapisać ejs jako oddzielny plik, a następnie renderować go jako tekst (który nie zostanie oceniony jako erb) wewnątrz znacznika skryptu.

Wewnątrz erb częściowej:

<script id="my_awesome_template" type="text/x-ejs"> 
    <%= render :text => File.open("app/views/controller_name/_my_awesome_template.html.ejs").read %> 
</script>` 

W pliku javascript:

new EJS({element: document.getElementById('my_awesome_template')}).render(data) 
2

Ucieczka zmiennych podkreślenia: (te, których nie chcesz erb interpolować)

<%= foo %> becomes: 

<%%= foo %>