我正在编写一个最终输出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文件,因此,我希望在生成报告时将这些样式表内联到文档头中。
这看起来应该很容易,但是我在最后一小时一直撞墙(和谷歌搜索和RTMF),我根本没有运气。
这应该如何完成?感谢。
答案 0 :(得分:34)
可以通过评估&lt;%=%&gt;内的子模板来嵌套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>
答案 1 :(得分:12)
我需要在Sinatra应用程序中使用它,我发现我可以像调用原始文件一样调用它:
在sinatra应用程序中,我将索引称为:
erb :index
然后,在索引模板中,我可以对任何子模板执行相同的操作:
<div id="controls">
<%= erb :controls %>
..显示了&#39; controls.erb&#39;模板。
答案 2 :(得分:7)
<%= ERB.new(sub_template_content).result(binding) %>
不起作用,当您使用 erb cli实用程序时,会覆盖多个 _erbout 变量,并且只使用最后一个变量。
像这样使用它:
<%= ERB.new(sub_template_content, eoutvar='_sub01').result(binding) %>
答案 3 :(得分:6)
在我的.erb文件中,我必须这样做:
<%= ERB.new(File.read('pathToFile/myFile.erb'), nil, nil, '_sub01').result(binding) %>
此主题中的其他答案假设您有一个包含内容的变量。此版本检索内容。