【发布时间】:2011-03-02 19:28:30
【问题描述】:
我阅读了 Magnus Holm 的一篇题为 Block Helpers in Rails 3 的帖子,其中他指出 Rails 3 过度弯曲 ERB 的语法。 (在“原始”ERB 中,ERB 构造只能跨越单个语句。Rails 3 允许 - 甚至需要 - 跨越多个语句。)
这让我想知道:与 Ruby 的原生字符串处理相比,使用 ERB 的真正优势是什么?为了深入研究这一点,我采用了 ERB 文档中列出的示例,并在 ERB 和原生 Ruby 字符串中进行了尝试。事实证明,Ruby 丰富的字符串处理库让翻译变得非常简单——甚至是直观的。
这是它的外观。两者共有(直接取自 ERB 文档):
require "erb"
# Build template data class.
class Product
def initialize( code, name, desc, cost )
@code = code
@name = name
@desc = desc
@cost = cost
@features = [ ]
end
def add_feature( feature )
@features << feature
end
# Support templating of member data.
def get_binding
binding
end
end
这是用 ERB 编写的模板和扩展:
# ================================================================
# using ERB
erb_template = %{
<html>
<head><title>Ruby Toys -- <%= @name %></title></head>
<body>
<h1><%= @name %> (<%= @code %>)</h1>
<p><%= @desc %></p>
<ul>
<% @features.each do |f| %>
<li><b><%= f %></b></li>
<% end %>
</ul>
<p>
<% if @cost < 10 %>
<b>Only <%= @cost %>!!!</b>
<% else %>
Call for a price, today!
<% end %>
</p>
</body>
</html>
}.gsub(/^ /, '')
rhtml = ERB.new(erb_template)
# Produce results
@r1 = rhtml.result(toy.get_binding)
这是用纯 Ruby 编写的模板:
# ================================================================
# using native Ruby strings
ruby_template = %q{"
<html>
<head><title>Ruby Toys -- #{ @name }</title></head>
<body>
<h1>#{ @name } (#{ @code })</h1>
<p>#{ @desc }</p>
<ul>
#{ @features.map do |f|
"<li><b>#{f}</b></li>\n"
end.join }
</ul>
<p>
#{ if @cost < 10
"<b>Only #{ @cost }!!!</b>"
else
"Call for a price, today!"
end
}
</p>
</body>
</html>
"}
# Produce results
@r2 = eval(ruby_template, toy.get_binding)
这些产生相同的结果(模空格)。 ERB 是更简单还是更难,这实际上是一个品味和经验的问题。从关于 ERB 和 vs vs 的问题数量来看,似乎很多人可能更容易坚持纯 Ruby .
冒着引发某种圣战的风险,当原生 Ruby 做同样的工作时,为什么还要使用 ERB?你觉得ERB有用吗? Rails 是否也应该接受“原生 Ruby”模板?
【问题讨论】:
标签: ruby-on-rails ruby-on-rails-3 erb