Including one erb file into another

余生长醉 提交于 2019-11-28 18:16:21

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

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

From within my .erb file, I had to do this:

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

The other answers in this thread assumed you had a variable with your content in it. This version retrieves the content.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!