最終的にHTMLレポートを出力するコマンドラインツールを書いています。ツールはRubyで書かれています。 (私はRailsを使用していません)。アプリケーションのロジックを1つのファイルセットに保持し、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...
この例のスニペットはitself erbファイルであり、アプリケーションロジック内から呼び出されます。
アプリケーションを保守するのがより簡単/よりクリーンになるように、スタイルシートをメインテンプレートから除外できるように、私はこのようにしています。ただし、最終製品(レポート)は、依存関係のない単一のスタンドアロンHTMLファイルである必要があるため、レポートの生成時にこれらのスタイルシートをドキュメントヘッドにインライン化します。
これは簡単なように思えますが、私はこの1時間、壁に頭をぶつけて(そしてグーグルやRTMFをして)、まったく運がありませんでした。
これはどのように行われるべきですか?ありがとう。
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>
これはSinatraアプリで必要ですが、元のアプリと同じ方法で呼び出すことができます。
Sinatraアプリでは、インデックスを呼び出します。
erb :index
次に、インデックステンプレートで、すべてのサブテンプレートに対して同じことを行うことができます。
<div id="controls">
<%= erb :controls %>
..これは「controls.erb」テンプレートを示しています。
私の.erbファイル内から、これを行わなければなりませんでした:
<%= ERB.new(File.read('pathToFile/myFile.erb'), nil, nil, '_sub01').result(binding) %>
このスレッドの他の回答では、コンテンツが含まれる変数があると想定しています。このバージョンはコンテンツを取得します。
<%= ERB.new(sub_template_content).result(binding) %>
erb cliユーティリティを使用している場合、機能しません。複数の_ erbout変数がオーバーライドされ、最後の変数のみが使用されます。
次のように使用します。
<%= ERB.new(sub_template_content, eoutvar='_sub01').result(binding) %>