Подтвердить что ты не робот

Включая один файл erb в другой

Я пишу инструмент командной строки, который в конечном итоге выводит отчет 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 файлом, который не имеет зависимостей, и поэтому я хочу встроить эти таблицы стилей в заголовок документа при создании отчета.

Это похоже на то, что это должно быть легко, но я ударил головой о стену (и Googling и RTMF'ing) в течение последнего часа, и мне вообще не повезло.

Как это должно быть сделано? Спасибо.

4b9b3361

Ответ 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>

Ответ 2

Мне нужно это в приложении Sinatra, и я нахожу, что могу просто называть его так же, как я назвал оригинал:

В приложении sinatra я вызываю индекс:

erb :index

Затем в шаблоне индекса я могу сделать то же самое для любого подшаблона:

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

.., который показывает шаблон 'controls.erb'.

Ответ 3

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

не работает, когда вы используете утилиту erb cli, несколько переменных _erbout переопределяются и используется только последний.

используйте его следующим образом:

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

Ответ 4

Из моего .erb файла я должен был сделать это:

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

Другие ответы в этом потоке предполагали, что у вас есть переменная с вашим контентом. Эта версия извлекает содержимое.