2012-04-19 13 views
19

Sto scrivendo uno strumento da riga di comando che alla fine emetterà un report HTML. Lo strumento è scritto in Ruby. (Non sto usando Rails). Sto cercando di mantenere la logica dell'applicazione in un set di file e i modelli HTML (i file .erb) in un altro set.Incluso un file ERB in un altro

Tuttavia, sto riscontrando un problema davvero fastidioso: non riesco a includere correttamente un file .erb in un altro.

Per essere precisi, sto cercando di fare qualcosa di simile (in pseudo-codice):

<html> 
<head> 
    <style type='text/css'> 
    [include a stylesheet here] 
    [and another one here] 
    </style> 
</head> 
<body> 
    <p>The rest of my document follows... 

Quel frammento di esempio è un file erb, che viene invocato dall'interno dell'applicazione logica.

Sto facendo le cose in questo modo in modo da poter tenere i miei fogli di stile fuori dal modello principale per rendere più facile/pulito mantenere l'applicazione. Il prodotto finale (il report), tuttavia, deve essere un singolo file HTML autonomo che non ha dipendenze e, pertanto, desidero integrare tali fogli di stile nella testa del documento quando viene generato il report.

Sembra che questo dovrebbe essere facile, ma ho battuto la testa contro un muro (e Googling e RTMF'ing) per l'ultima ora, e non ho alcuna fortuna.

Come dovrebbe essere fatto? Grazie.

risposta

31

I modelli ERB possono essere nidificati valutando il modello secondario da <% =%> del modello principale.

<%= ERB.new(sub_template_content).result(binding) %> 

Ad esempio:

require "erb" 

class Page 
    def initialize title, color 
    @title = title 
    @color = color 
    end 

    def render path 
    content = File.read(File.expand_path(path)) 
    t = ERB.new(content) 
    t.result(binding) 
    end 
end 

page = Page.new("Home", "#CCCCCC") 
puts page.render("home.html.erb") 

home.html.erb:

<title><%= @title %></title> 
<head> 
    <style type="text/css"> 
<%= render "home.css.erb" %> 
    </style> 
</head> 

home.css.erb:

body { 
    background-color: <%= @color %>; 
} 

produce:

<title>Home</title> 
<head> 
    <style type="text/css"> 
body { 
    background-color: #CCCCCC; 
} 
    </style> 
</head> 
+0

Non sto lavorando su Rails, quindi non penso * che le cose di 'rendering' siano valide per me (potrebbe essere sbagliato), ma quella prima riga funzionava come un campione. Grazie molto! –

+3

Il metodo di rendering è stato definito nell'esempio precedente utilizzando puro std ruby, quindi può essere utilizzato in un ambiente privo di guide. Saluti. – cydparser

+0

Ha, wow. Non so come non l'ho notato. Grazie per averlo sottolineato, e grazie per la soluzione. Ha funzionato perfettamente. –

6
<%= ERB.new(sub_template_content).result(binding) %> 

non funziona, quando si utilizza erb utilità cli, multipla _erbout variabili sono sovrascritti e solo ultimo viene utilizzato.

uso in questo modo:

<%= ERB.new(sub_template_content, eoutvar='_sub01').result(binding) %> 
+3

Avevo bisogno di fare 'ERB.new (sub_template_context, nil, nil, '_sub01'). Result (binding)' quando si utilizza la cucina di prova. Deve usare una versione precedente di ruby ​​o qualcosa del genere. – Jack

+0

Penso che stavo usando Ruby 1.8 quando aggiungo questa risposta – mighq

11

sto bisogno di questo in un'app Sinatra, e trovo che posso solo chiamare allo stesso modo ho chiamato l'originale:

Nel Sinatra app, che io chiamo l'indice:

erb :index 

Poi, nel modello dell'indice, posso fare lo stesso per qualsiasi sub-template:

<div id="controls"> 
    <%= erb :controls %> 

.. che mostra il modello 'controls.erb'.

+1

Questa è sicuramente la risposta più semplice, e quindi la migliore. –

+2

Se si superano i var locali ('erb: index,: locals => {...}') e si devono passare quei vars locali, si può chiamare '<% = erb (: controls, {}, locals)%> ' – pjgranahan

0

da dentro il mio file di .erb, ho dovuto fare questo:

<%= ERB.new(File.read('pathToFile/myFile.erb'), nil, nil, '_sub01').result(binding) %> 

Le altre risposte in questa discussione si aveva assunto una variabile con il contenuto in esso. Questa versione recupera il contenuto.