How can I use yield for template inheritance in erb? I want to use erb in a plain ruby CGI script and want to use a base template and subtemplate like it Rails wit
I don't think you can - Rails provides that infrastructure as part of actionpack.
What you may be able to do is take actionpack and add it into your script.
Alternatively you could roll a lightweight templating system yourself.
Alternatively alternatively use Rails or Merb or Sinatra.
You can use Tilt but if you don't want to add an extra dependency, here's a better example on how you can yield in erb:
require "erb"
class Controller
TEMPLATE = ERB.new("Hello <%= @someone %>\n\n<%= yield %>")
def initialize(someone)
@someone = someone
end
def render
TEMPLATE.result(self.get_binding { yield })
end
def get_binding
binding
end
end
puts Controller.new("World").render { "I'm Jack" }
# =>
Hello World
I'm Jack
I found the answer here.
I wrote about adding this to the Standard Library's ERB here http://hostiledeveloper.com/2015/05/28/working-with-templates-in-ruby-erb.html
It's surprisingly a pain in the butt.
app.rb
require 'erb'
class Template
def render(template_name="base")
ERB.new(File.read("#{template_name}.erb")).result(binding)
end
end
result = Template.new.render do
ERB.new(File.read("index.erb")).result
end
puts result
base.erb
<main>
<%= render "footer" %>
<%=yield %>
</main>
index.erb
<h1>Index Page</h1>
footer.erb
<h1>Footer here</h1>
output image:
def a
ERB.new('<%= yield %>').result(binding)
end
a{123}
#=> "123"
It's important that the call to Kernel#binding
be inside a method, that way the context includes the block (ERB#result
won't take a block).
Check out Tilt (http://github.com/rtomayko/tilt/). It's the gem that handles templating in Sinatra and it provides ERB yields along with many other nice features.