问题
I want to do something like this:
require 'erb'
@var = 'test'
template = ERB.new File.new("template.erb").read
rendered = template.result(binding())
But how can I use partials in template.erb?
回答1:
Perhaps brute-force it?
header_partial = ERB.new(File.new("header_partial.erb").read).result(binding)
footer_partial = ERB.new(File.new("footer_partial.erb").read).result(binding)
template = ERB.new <<-EOF
<%= header_partial %>
Body content...
<%= footer_partial %>
EOF
puts template.result(binding)
回答2:
Was trying to find out the same thing and didn't find much that was satisfying other than using the Tilt gem, which wraps ERB and other templating systems and supports passing blocks (aka, the results of a separate render call) which may be a little nicer.
Seen on: https://code.tutsplus.com/tutorials/ruby-for-newbies-the-tilt-gem--net-20027
layout.erb
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title><%= title %></title>
</head>
<body>
<%= yield %>
</body>
</html>
Then in your ruby call
template = Tilt::ERBTemplate.new("layout.erb")
File.open "other_template.html" do |file|
file.write template.render(context) {
Tilt::ERBTemplate.new("other_template.erb").render
}
end
It will apply the results of the other_template
into the yield
body.
来源:https://stackoverflow.com/questions/9840870/how-to-implement-erb-partials-in-a-non-rails-app