Включая один файл erb в другой
Я пишу инструмент командной строки, который в конечном итоге выводит отчет HTML. Инструмент написан на Ruby. (Я не использую Rails). Я пытаюсь сохранить логику приложения в одном наборе файлов и HTML-шаблонах (файлы .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...
Этот фрагмент примера сам по себе является файлом erb, который вызывается из логики приложения.
Я делаю это так, поэтому я могу сохранить свои таблицы стилей из основного шаблона, чтобы упростить/очистить его. Конечный продукт (отчет), однако, должен быть единым автономным HTML файлом, который не имеет зависимостей, и поэтому я хочу встроить эти таблицы стилей в заголовок документа при создании отчета.
Это похоже на то, что это должно быть легко, но я ударил головой о стену (и Googling и RTMF'ing) в течение последнего часа, и мне вообще не повезло.
Как это должно быть сделано? Спасибо.
Ответы
Ответ 1
Шаблоны 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>
Ответ 2
Мне нужно это в приложении Sinatra, и я нахожу, что могу просто называть его так же, как я назвал оригинал:
В приложении sinatra я вызываю индекс:
erb :index
Затем в шаблоне индекса я могу сделать то же самое для любого подшаблона:
<div id="controls">
<%= erb :controls %>
.., который показывает шаблон 'controls.erb'.
Ответ 3
<%= ERB.new(sub_template_content).result(binding) %>
не работает, когда вы используете утилиту erb cli, несколько переменных _erbout переопределяются и используется только последний.
используйте его следующим образом:
<%= ERB.new(sub_template_content, eoutvar='_sub01').result(binding) %>
Ответ 4
Из моего .erb файла я должен был сделать это:
<%= ERB.new(File.read('pathToFile/myFile.erb'), nil, nil, '_sub01').result(binding) %>
Другие ответы в этом потоке предполагали, что у вас есть переменная с вашим контентом. Эта версия извлекает содержимое.