Ruby on rails RoR:在Rails代码中erb有什么好处?

Ruby on rails RoR:在Rails代码中erb有什么好处?,ruby-on-rails,ruby-on-rails-3,erb,Ruby On Rails,Ruby On Rails 3,Erb,我读了一篇由Magnus Holm撰写的题为“Rails 3将ERB的语法扭曲得太厉害”的文章,这篇文章很有启发性。(在“原始”ERB中,ERB构造只能跨越一条语句。Rails 3允许甚至需要跨越多条语句。) 这让我想知道:与Ruby的原生字符串处理相比,使用ERB的真正优势是什么?为了深入了解这一点,我采用了ERB文档中列出的示例,并在ERB和原生Ruby字符串中进行了尝试。事实证明,Ruby丰富的字符串处理库使得翻译非常简单——甚至是直观的 这是它的样子。两者通用(直接摘自雇员再培训局文件)

我读了一篇由Magnus Holm撰写的题为“Rails 3将ERB的语法扭曲得太厉害”的文章,这篇文章很有启发性。(在“原始”ERB中,ERB构造只能跨越一条语句。Rails 3允许甚至需要跨越多条语句。)

这让我想知道:与Ruby的原生字符串处理相比,使用ERB的真正优势是什么?为了深入了解这一点,我采用了ERB文档中列出的示例,并在ERB和原生Ruby字符串中进行了尝试。事实证明,Ruby丰富的字符串处理库使得翻译非常简单——甚至是直观的

这是它的样子。两者通用(直接摘自雇员再培训局文件):

需要“erb”
#构建模板数据类。
类产品
def初始化(代码、名称、描述、成本)
@代码=代码
@name=name
@desc=desc
@成本=成本
@功能=[]
结束
def添加功能(功能)

@功能Rails是一款固执己见的软件。它附带了一系列“默认”的做事方式,我想核心团队都同意这是他们首选的做事方式——erb、Test::Unit、prototype等等。但是没有什么可以阻止您更改这些方式(Rails 3更是如此)

在我看来,Rails中的erb,尽管与普通的erb不太一样,但比ruby字符串插值要好得多,尤其是在块方面。在我看来,必须在块中重新分解为HTML的字符串非常可怕

但话说回来,哈姆尔在我看来很可怕,而其他人却对它发誓并憎恨erb。这完全取决于你的喜好。这就是为什么Rails使开发人员能够很容易地创建自己的模板系统。我不知道是否存在这样的模板系统,但是没有什么可以阻止开发人员创建一个只使用ruby字符串的模板系统


所以,在回答“Rails是否也应该接受“原生Ruby”模板”时,它已经接受了。只要有人实施;)

Magnus Holm在这里;很高兴看到你喜欢这篇文章:-)

首先让我们看一下模板(是的,插值是一个模板),它是从使用常规代码构造字符串演变而来的:

# "Regular" way of constructing a string:
str = "Hello World: "
@users.each do |user|
  str << "How are you today, "
  str << user.name
  str << "? \n"
end
我不知道是否可以用语法来解决这个问题,但是现在它在每个框架中都是“固定”的,并且没有办法编写跨多个框架工作的块帮助程序。我希望看到一个更“正式”的方式来处理这个问题

Rails是否也应该接受“原生Ruby”模板


已经做到了,最好的解决方案是Rails切换到Tilt,但我认为“原生Ruby”毕竟没有那么有用。如果是短模板,当然可以在代码中直接使用插值字符串。如果它是一个大模板,并且您打算将其从Ruby文件中移出,为什么不使用为模板设计的语法?

您应该再给haml一次机会,它需要一段时间才能适应您,但一旦它适应了,就很难回头了。我讨厌它,直到我找到了一个textmate捆绑包。@jonnii,我用了很多。我仍在从事的许多项目都在使用它,我可以很有把握地说,在我看来,这太可怕了。如果我在写html,我想使用html。我在编写干净的html和有效地使用partials和helpers方面没有问题。我在阅读编写良好的html时没有任何问题。除了ERB的一些粗俗之处之外,我无法想象在我的模板系统中还需要其他东西。我喜欢它的标记更少,因为嵌套负责发出结束标记,但我知道你的意思。您看过asp.net mvc的视图引擎吗?如果我们能为rails提供这样的服务,那就太好了。我还没见过。。。它看起来很漂亮!
# ================================================================
# 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)
# ================================================================
# 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)
# "Regular" way of constructing a string:
str = "Hello World: "
@users.each do |user|
  str << "How are you today, "
  str << user.name
  str << "? \n"
end
# This block is more like a statement (we don't care about the return value)
@users.each do |foo|
  str << "Hello"
end

# This block is an expression
str << form_for(thing) do
  another_string
end