16

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

4

5 回答 5

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

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

于 2010-09-19T08:33:43.910 回答
5

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

于 2011-11-02T15:27:13.850 回答
4

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

我在这里找到了答案。

于 2014-03-18T16:48:59.223 回答
3

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

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

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

或者,使用 Rails 或 Merb 或 Sinatra。

于 2010-03-18T03:00:52.757 回答
1

应用程序.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>

索引.erb

<h1>Index Page</h1>

页脚.erb

<h1>Footer here</h1>

输出图像:

在此处输入图像描述

于 2020-11-26T14:52:59.667 回答