Włączenie jednego pliku erb do innego

Piszę narzędzie wiersza poleceń, które ostatecznie wyświetli raport HTML. Narzędzie jest napisane w Ruby. (Nie używam Rails). Staram się zachować logikę aplikacji w jednym zestawie plików, a szablony HTML (the .pliki erb) w innym zestawie.

Mam naprawdę irytujący problem: nie mogę go z powodzeniem włączyć .plik erb do innego.

Mówiąc konkretnie, staram się zrobić coś takiego (w pseudo-kodzie):

<html>
<head>
  <style type='text/css'>
    [include a stylesheet here]
    [and another one here]
  </style>
</head>
<body>
  <p>The rest of my document follows...

Ten przykładowy fragment jest samym w sobie plikiem erb, który jest wywoływany z poziomu logiki aplikacji.

Robię rzeczy w ten sposób, więc mogę zachować moje arkusze stylów z głównego szablonu, aby ułatwić / czystsze utrzymanie aplikacji. Produkt końcowy (raport) musi być jednak pojedynczym, samodzielnym plikiem HTML, który nie ma zależności, dlatego chcę wstawić te arkusze stylów do nagłówka dokumentu, gdy raport jest generowany.

Wydaje się, że to powinno być łatwe, ale Od godziny walę głową o ścianę (i Googluję, i RTMF ' ING) i nie mam szczęścia.

Jak to ma być zrobione? Dzięki.
Author: Chris Allen Lane, 2012-04-20

4 answers

Szablony ERB mogą być zagnieżdżane, oceniając pod-szablon z poziomu głównego szablonu.

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

Na przykład:

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")

Do domu.html.erb:

<title><%= @title %></title>
<head>
  <style type="text/css">
<%= render "home.css.erb" %>
  </style>
</head>

Do domu.css.erb:

body {
  background-color: <%= @color %>;
}

Produkuje:

<title>Home</title>
<head>
  <style type="text/css">
body {
  background-color: #CCCCCC;
}
  </style>
</head>
 32
Author: cydparser,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-20 06:25:07

Potrzebuję tego w aplikacji Sinatra i stwierdzam, że mogę go nazwać tak samo, jak nazwałem oryginał:

W aplikacji sinatra wywołuję indeks:

erb :index

Wtedy w szablonie indeksu mogę zrobić to samo dla dowolnego pod-szablonu:

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

..który pokazuje ' kontrolki.szablon erb.

 12
Author: Jon Carter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-20 13:30:37
<%= ERB.new(sub_template_content).result(binding) %>

Nie działa, gdy używasz narzędzia erb cli, wiele zmiennych _erbout jest nadpisywanych i używana jest tylko ostatnia.

Użyj go tak:

<%= ERB.new(sub_template_content, eoutvar='_sub01').result(binding) %>
 6
Author: mighq,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-31 11:04:38

From within my .plik erb, musiałem to zrobić:

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

Inne odpowiedzi w tym wątku zakładały, że masz zmienną z zawartością w niej. Ta wersja pobiera zawartość.

 2
Author: Joseph Larson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-07 16:33:02