在没有轨道的ERB中产量

如何在erb中使用yield进行模板inheritance? 我想在一个简单的ruby CGI脚本中使用erb,并希望使用一个基本模板和子模板,就像它与应用程序模板一样。

我不认为你可以–Rails提供该基础设施作为actionpack的一部分。

您可以做的是采取actionpack并将其添加到您的脚本中。

或者,您可以自己滚动一个轻量级的模板系统。

或者使用Rails或Merb或Sinatra。

def a ERB.new('<%= yield %>').result(binding) end a{123} #=> "123" 

重要的是对Kernel#binding的调用在方法内部,这样上下文包含块( ERB#result不会占用块)。

查看Tilt( http://github.com/rtomayko/tilt/ )。 它是在Sinatra处理模板的gem,它提供ERB产量以及许多其他不错的function。

您可以使用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 

我在这里找到了答案。

我写过关于将此添加到标准库的ERB中http://hostiledeveloper.com/2015/05/28/working-with-templates-in-ruby-erb.html

令人惊讶的是,这是一个痛苦的屁股。