如何在 erb 中使用yield进行模板继承?我想在一个普通的 ruby CGI 脚本中使用 erb,并且想使用一个基本模板和子模板,就像 Rails 和应用程序模板一样。
问问题
6646 次
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 回答