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