【问题标题】:Including one erb file into another将一个 erb 文件包含到另一个文件中
【发布时间】:2012-05-01 10:30:58
【问题描述】:

我正在编写一个最终输出 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...

该示例 sn-p 本身是一个 erb 文件,正在从应用程序逻辑中调用。

我这样做是为了让我的样式表远离主模板,以便更轻松/更清洁地维护应用程序。但是,最终产品(报告)需要是一个没有依赖关系的单一、独立的 HTML 文件,因此,我想在生成报告时将这些样式表内联到文档头中。

这看起来应该很容易,但在过去的一个小时里,我一直在用头撞墙(以及谷歌搜索和 RTMF),而且我一点运气都没有。

这应该怎么做?谢谢。

【问题讨论】:

    标签: ruby erb templating


    【解决方案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>
    

    【讨论】:

    • 我不在 Rails 中工作,所以我不认为“渲染”的东西适用于我(可能是错误的),但第一行就像一个冠军。非常感谢!
    • 上例中的render方法是使用纯std ruby​​定义的,因此可以在无rails的环境中使用。干杯。
    • 哈,哇。不知道我怎么没注意到。感谢您指出这一点,并感谢您的解决方案。效果很好。
    • 相关:如果您只包含静态内容,您应该能够执行&lt;%= File.read("common.txt") %&gt; 之类的操作。
    • 调用子模板上方的父模板部分会消失,直到我在下面的@mighq 的答案(和杰克的评论)中使用了修复程序
    【解决方案2】:

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

    在 sinatra 应用中,我调用索引:

    erb :index
    

    然后,在索引模板中,我可以对任何子模板做同样的事情:

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

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

    【讨论】:

    • 这绝对是最简单,因此也是最好的答案。
    • 如果您传递本地变量 (erb :index, :locals =&gt;{...}) 并且需要传递这些本地变量,则可以调用 &lt;%= erb(:controls, {}, locals)%&gt;
    【解决方案3】:
    <%= ERB.new(sub_template_content).result(binding) %>
    

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

    像这样使用它:

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

    【讨论】:

    • 我在使用测试厨房时需要做ERB.new(sub_template_context, nil, nil, '_sub01').result(binding)。它必须使用旧版本的 ruby​​ 或其他东西。
    • 我想我在添加这个答案时使用的是 Ruby 1.8
    【解决方案4】:

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

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

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

    【讨论】:

    • 我可以将它与测试厨房一起使用。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2011-10-27
    • 1970-01-01
    • 2011-11-24
    • 2017-04-06
    • 2011-06-23
    • 2023-03-03
    • 2019-12-09
    相关资源
    最近更新 更多