web-dev-qa-db-ja.com

あるERBファイルを別のERBファイルに含める

最終的に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をして)、まったく運がありませんでした。

これはどのように行われるべきですか?ありがとう。

29

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>
34
cydparser

これはSinatraアプリで必要ですが、元のアプリと同じ方法で呼び出すことができます。

Sinatraアプリでは、インデックスを呼び出します。

erb :index

次に、インデックステンプレートで、すべてのサブテンプレートに対して同じことを行うことができます。

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

..これは「controls.erb」テンプレートを示しています。

15
Jon Carter

私の.erbファイル内から、これを行わなければなりませんでした:

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

このスレッドの他の回答では、コンテンツが含まれる変数があると想定しています。このバージョンはコンテンツを取得します。

9
Joseph Larson
<%= ERB.new(sub_template_content).result(binding) %>

erb cliユーティリティを使用している場合、機能しません。複数の_ erbout変数がオーバーライドされ、最後の変数のみが使用されます。

次のように使用します。

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