Including one erb file into another Including one erb file into another ruby ruby

Including one erb file into another


ERB templates can be nested by evaluating the sub-template from within <%= %> of the main template.

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

For example:

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)  endendpage = 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 %>;}

produces:

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


I'm needing this in a Sinatra app, and I find that I can just call it the same way I called the original:

In the sinatra app, I call the index:

erb :index

Then, in the index template, I can do the same for any sub-template:

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

..which shows the 'controls.erb' template.


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

does not work, when you are using erb cli utility, multiple _erbout variables are overriden and only last one is used.

use it like this:

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