没有铁轨的ERB产量

时间:2010-03-17 08:57:57

标签: ruby-on-rails ruby erb

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

6 个答案:

答案 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>

输出图像:

enter image description here