2011-01-17 11 views
5

Ben javascript ağır raylar 3 app yapıyorum. Ejs (http://embeddedjs.com/) üzerine inşa edilmiş çok şık bir şablonlama mekanizmasına sahip olan underscore.js'yi kullanır.Bir erb şablonu içine bir ejs şablonu gömülmesi

Sorun: embeddedjs, bir erb şablonundaki ejs şablonları dahil olmak üzere, erb sözdiziminden büyük oranda borç alır, bu nedenle görünümle ilgili sorunlara neden olur.

Bir erb dosyasında "erb olmayan" bölümleri eklemenin bir yolu var mı? Bu, erb dosyaları içindeki ejs şablonlarını tanımlamama izin verir. Şu anda ejs şablonlarını içeren bir dosyanın ham içeriğini okuyan ve bunu erb şablonunda ham bir dize olarak çıkaran bir yardımcıya sahip olduğum bir hack kullanıyorum.

+1

Haml'da bu: 'düz 'filtre ile kolay olurdu. http://haml-lang.com/docs/yardoc/file.HAML_REFERENCE.html#plain-filter – Heikki

cevap

3

Ben sorunu çözmek için bu hile kullanmak:

// 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'); 

Bu <%% değiştirir> için {{}} ve bana JS tarafından kullanılan şablonlar için <%%> kullanalım. Bu, klasik stil şablonlarım olmadığı için benim için çalışıyor (<%%>).

Eğer bunlardan çok fazlasına sahipseniz, aynı numarayı ancak underscore.js şablonları için de kullanabilirsiniz.

+0

Bu tam olarak istediğim şey ama bunu Rails'e nasıl bağlayacağımı bilmiyorum. (Altyazı kullanmıyorum, sadece EJS ve JST.) – carpeliam

+0

Sorunumun çözümünü buldum - EJS.evaluation_pattern'i/\ {\ {([\ s \ S] +?) \} \}/Ve EJS'ye atayın Bir başlatıcıda .interpolation_pattern/\ {\ {= ([\ s \ S] +?) \} \} /. – carpeliam

2

EJ'leri ayrı bir dosya olarak kaydedebilir ve komut dosyası etiketinde bir metin olarak (erb olarak değerlendirilmeyecek) metin haline getirebilirsiniz. JavaScript dosyasında

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

: kısmi sizin erb İçinde

new EJS({element: document.getElementById('my_awesome_template')}).render(data) 
2
sizin Underscore değişkenleri Escape

: (Eğer erb interpole istemediğiniz olanları)

<%= foo %> becomes: 

<%%= foo %>