如何在erb中使用 yield 进行模板继承?我想在一个普通的ruby CGI脚本中使用erb,并希望使用一个基本模板和子模板,就像它与应用程序模板一样Rails。
答案 0 :(得分:37)
def a
ERB.new('<%= yield %>').result(binding)
end
a{123}
#=> "123"
对Kernel#binding
的调用非常重要,因为上下文包含块(ERB#result
不会占用块)。
答案 1 :(得分:5)
查看倾斜(http://github.com/rtomayko/tilt/)。它是在Sinatra处理模板的宝石,它提供ERB产量以及许多其他不错的功能。
答案 2 :(得分:3)
我认为你不能--Rails将该基础设施作为actionpack的一部分提供。
您可以做的是将actionpack添加到脚本中。
或者你可以自己滚动一个轻量级的模板系统。
或者使用Rails或Merb或Sinatra。
答案 3 :(得分:3)
你可以使用Tilt,但如果你不想添加额外的依赖,那么这里有一个更好的例子,说明如何在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
我找到了答案here。
答案 4 :(得分:0)
我写了关于将此添加到标准库的ERB http://hostiledeveloper.com/2015/05/28/working-with-templates-in-ruby-erb.html
的文章令人惊讶的是屁股上的疼痛。
答案 5 :(得分:0)
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>
输出图像: