32

我正在编写一个最终输出 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),而且我一点运气都没有。

这应该怎么做?谢谢。

4

4 回答 4

39

通过从主模板的 <%= %> 中评估子模板,可以嵌套 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>
于 2012-04-20T06:25:07.147 回答
17

我在 Sinatra 应用程序中需要它,我发现我可以像调用原始应用程序一样调用它:

在 sinatra 应用程序中,我将索引称为:

erb :index

然后,在索引模板中,我可以对任何子模板执行相同的操作:

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

..显示“controls.erb”模板。

于 2015-05-20T13:30:37.657 回答
10
<%= ERB.new(sub_template_content).result(binding) %>

不起作用,当您使用erb cli 实用程序时,会覆盖多个_erbout变量,并且只使用最后一个。

像这样使用它:

<%= ERB.new(sub_template_content, eoutvar='_sub01').result(binding) %>
于 2013-12-31T11:04:38.243 回答
9

在我的 .erb 文件中,我必须这样做:

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

该线程中的其他答案假设您的内容中有一个变量。此版本检索内容。

于 2017-07-07T16:33:02.197 回答