符号之间有什么区别:
"
some text
#{some_ruby_code}
some text
#{some_more_ruby_code}
some_other_text
"
和
ERB.new("
some text
<%=some_ruby_code%>
some text
<%=some_more_ruby_code%>
some_other_text
").result
我只是有一个广泛的印象,即erb符号可能更强大,但不是那么清楚。你能从不同方面比较它们,并告诉哪些应该在什么样的场合使用?什么样的事情可以用一种符号而不是另一种符号来做?
添加1
到目前为止,大多数答案似乎都声称erb效率低下,并且在"#{ }"
可以使用时不应该使用。现在,让我们问另一种方式。为什么"#{ }"
符号不能代替erb?会不会更快更好?
添加2
下面的大多数答案似乎都假设"#{ }"
的单个出现不会跨越多行,因此无法嵌入像一个采用多行的循环的代码块。但为什么不呢?如果您这样做,我认为与使用<% >
执行此操作没有任何区别,除了在后者中您将<% >
放在每一行中。
答案 0 :(得分:5)
你的ERB
版本应该产生与正常版本相同的结果(我认为),你是对的,但它的目的完全不同。
ERB
实际上仅用于模板化:如果您需要生成文本(如HTML页面或文档),某些模板引擎(如ERB
)将是正确的工具。然而,它不适用于简单的字符串插值:虽然它确实能够做到这一点,但它是一种相当周边的方式来实现它。实际上,您实际上是从字符串创建ERB
对象,然后将其评估回字符串。
通过快速基准测试,您可以了解这是多么低效:
$ irb -rbenchmark -rerb
ruby-1.9.2-p136 :023 > Benchmark.bm do |bm|
ruby-1.9.2-p136 :024 > bm.report 'interpolation' do
ruby-1.9.2-p136 :025 > a = 'hello there'
ruby-1.9.2-p136 :026?> 5000.times { "well #{a}" }
ruby-1.9.2-p136 :027?> end
ruby-1.9.2-p136 :028?> bm.report 'erb' do
ruby-1.9.2-p136 :029 > a = 'hello there'
ruby-1.9.2-p136 :030?> 5000.times { ERB.new("well <%= a %>").result(binding) }
ruby-1.9.2-p136 :031?> end
ruby-1.9.2-p136 :032?> end
user system total real
interpolation 0.000000 0.000000 0.000000 ( 0.001495)
erb 0.340000 0.000000 0.340000 ( 0.352098)
=> true
将Ruby代码插入字符串的标准方法是在字符串文字中使用#{}
。它内置于语言级别(而不是库级别)。
答案 1 :(得分:4)
ERB的优点:
'
或"
总体而言,我认为总体思路是将软件开发人员需要完成的程序部分与前端Web开发人员可以完成的部分分开。例如,软件开发人员可以简单地指定@account_number
可用,并且可以由没有Ruby资格的HTMLers引用。
在现实生活中,似乎有很多单人项目,但至少在一次时,常规就是让团队处于典型问题。即使在今天,也可以从开发人员那里查看所有Rails问题,这些开发人员显然几乎不知道任何Ruby。 ERB早于Rails,所以如果你回到机制的起源,有一段时间你真的总是需要一个真正的软件部门,因为每个项目都涉及组建一个框架,所以你可能不想要求Ruby软件的资格来自团队中的每一位成员。
现在,我确实看到了你的意思。如果你已经了解Ruby,那么证明这种错误是非常困难的。
答案 2 :(得分:1)
尝试将ERB用于一般字符串插值的一个缺点是ERB实际上旨在生成HTML。结果将是许多编码问题,当你忘记了所有的东西,并对你的&符号,大于,小于等符号被破坏的原因感到困惑。
我认为ERB的计算开销也会增加,但这可能无关紧要。
此外,如果你在Ruby中放入内联的ERB,最终会在Ruby内部使用Ruby内部的ERB(当你在ERB中调用方法时可能会更多级别),这将是一个令人困惑的混乱。想想那些必须维护你的代码的可怜的灵魂,说可怜的灵魂甚至可能是你。
更新:您可以将#{}
用于简单的HTML模板(请参阅Mustache了解类似的内容)但是生成重复的部分会很困难而且很难看。重复的部分在HTML模板中很常见,因此对于HTML模板系统来说应该是简单而自然的。使用ERB,您可以:
<% a.each do |e| %>
<!-- ... -->
<% end %>
但#{}
插值会很麻烦。你最终也会#{html(blahblah)}
一直在做,大多数人都会忘记。
此外,“#”在URL中具有特殊含义,在CSS中具有不同的特殊含义(其中大括号也具有特殊含义);片段URL和CSS块在HTML模板中相当常见,所以你总是担心混淆。当使用#{}
在URL中生成CSS选择器或片段但这足以使其变得麻烦时,这种特殊的肮脏可能只是一个问题。