web-dev-qa-db-fra.com

Inclusion d'un fichier erb dans un autre

J'écris un outil en ligne de commande qui sortira finalement un rapport HTML. L'outil est écrit en Ruby. (Je n'utilise pas Rails). J'essaie de garder la logique de l'application dans un ensemble de fichiers et les modèles HTML (les fichiers .erb) dans un autre ensemble.

J'ai un problème vraiment ennuyeux: je ne parviens pas à inclure un fichier .erb dans un autre.

Pour être précis, j'essaie de faire quelque chose comme ça (en pseudo-code):

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

Cet exemple d'extrait est lui-même un fichier erb, qui est appelé depuis la logique d'application.

Je fais les choses de cette façon afin que je puisse garder mes feuilles de style hors du modèle principal pour faciliter/nettoyer la maintenance de l'application. Le produit final (le rapport), cependant, doit être un seul fichier HTML autonome qui n'a pas de dépendances, et donc, je veux incorporer ces feuilles de style dans la tête du document lorsque le rapport est généré.

Cela semble être facile, mais je me suis cogné la tête contre un mur (et Google, et RTMF'ing) pendant la dernière heure, et je n'ai pas de chance du tout.

Comment est-ce censé être fait? Merci.

29
Chris Allen Lane

Les modèles ERB peuvent être imbriqués en évaluant le sous-modèle à partir de <% =%> du modèle principal.

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

Par exemple:

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 %>;
}

produit:

<title>Home</title>
<head>
  <style type="text/css">
body {
  background-color: #CCCCCC;
}
  </style>
</head>
34
cydparser

J'en ai besoin dans une application Sinatra, et je trouve que je peux simplement l'appeler de la même manière que j'ai appelé l'original:

Dans l'application sinatra, j'appelle l'index:

erb :index

Ensuite, dans le modèle d'index, je peux faire de même pour n'importe quel sous-modèle:

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

..qui montre le modèle 'controls.erb'.

15
Jon Carter

Depuis mon fichier .erb, je devais faire ceci:

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

Les autres réponses de ce fil supposaient que vous aviez une variable avec votre contenu. Cette version récupère le contenu.

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

ne fonctionne pas, lorsque vous utilisez l'utilitaire erb cli, plusieurs variables _ erbout sont remplacées et seule la dernière est utilisée.

utilisez-le comme ceci:

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