2012-04-19 4 views
19

Я пишу инструмент командной строки, который в конечном итоге выводит отчет HTML. Инструмент написан на Ruby. (Я не использую Rails). Я пытаюсь сохранить логику приложения в одном наборе файлов и HTML-шаблонах (файлы .erb) в другом наборе.Включая один файл erb в другой

У меня возникает очень неприятная проблема: я не могу успешно включить один .erb-файл в другой.

Конкретно, я пытаюсь сделать что-то вроде этого (в псевдокоде):

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

Этот пример сниппет сам файл эрб, который в настоящее время вызывается из приложения логика.

Я делаю это так, поэтому я могу сохранить свои таблицы стилей из основного шаблона, чтобы упростить/очистить его. Конечный продукт (отчет), однако, должен быть единым автономным HTML-файлом, который не имеет зависимостей, и поэтому я хочу встроить эти таблицы стилей в заголовок документа при создании отчета.

Это похоже на то, что это должно быть легко, но я ударил головой о стену (и Googling и RTMF'ing) в течение последнего часа, и мне совсем не повезло.

Как это должно быть сделано? Благодарю.

ответ

31

Шаблоны ERB могут быть вложены путем оценки подшаблона из <% =%> основного шаблона.

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

Например:

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 %>; 
} 

производит:

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

Я не работаю в Rails, поэтому я не думаю, что этот материал «render» применим ко мне (может быть, неправильно), но эта первая строка работала как чемпион. Большое спасибо! –

+3

Метод визуализации был определен в приведенном выше примере с использованием чистого std ruby, поэтому его можно использовать в среде без рельсов. Приветствия. – cydparser

+0

Ха, ничего себе. Не знаю, как я этого не заметил. Спасибо, что указали это, и спасибо за решение. Он отлично работал. –

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

не работает, когда вы используете эрб CLI утилита, многократная _erbout переменные перекрываться и только последний используется.

использовать его как это:

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

Мне нужно было сделать 'ERB.new (sub_template_context, nil, nil, '_sub01'). Result (binding)' при использовании тестовой кухни. Он должен использовать более раннюю версию рубина или что-то в этом роде. – Jack

+0

Я думаю, что использовал Ruby 1.8 при добавлении этого ответа – mighq

11

Я нуждаясь это в приложении Синатры, и я считаю, что я могу назвать его так же, как я назвал оригинальную:

В Синатры приложение, я называю индекс:

erb :index 

Затем в шаблоне индекса, я могу сделать то же самое для любого суб-шаблона:

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

.. показывает шаблон 'controls.erb'.

+1

Это, безусловно, самый простой и, следовательно, лучший ответ. –

+2

Если вы передадите локальные вары ('erb: index,: locals => {...}'), и вам нужно передать эти локальные вары, вы можете затем вызвать '<% = erb (: элементы управления, {}, locals)%> ' – pjgranahan

0

Изнутри моего .erb файла, я должен был сделать это:

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

Другие ответы в этой теме предполагается, вы имели переменную с содержимым в нем. Эта версия извлекает содержимое.

Смежные вопросы