在Rails中,ERB中的<%,<%=,<%#和 – %>有什么区别?

有人可以描述在ERB文件中使用的以下字符的用法:

<% %> <%= %> <% -%> <%# %> 

每个人的用法是什么?

 <% %> 

执行括号内的ruby代码。

 <%= %> 

打印到erb文件的东西。

 <% -%> 

expression后避免换行。

 <%# %> 

在括号内注释掉代码; 不发送给客户端(而不是HTML注释)。

访问Ruby Doc获取更多关于ERB的信息。

<% %><%- and -%>适用于任何Ruby代码,但不会输出结果(例如if语句)。 两个是一样的

<%= %>用于输出Ruby代码的结果

ERB评论是<%# %>

这是一个很好的指导: http : //api.rubyonrails.org/classes/ActionView/Base.html

Rails默认使用stdlib的ERB ,它使用erubis 。 资料来源: 这个开发者的评论 , ActionView的gemspec , 接受了我写这个时候做的合并请求 。

它们之间存在行为差异,特别是连字符运算符%--%工作。

文档稀less, Ruby的ERB格式“正式”定义在哪里? 所以下面是实证结论。

所有的testing都假设:

 require 'erb' require 'erubis' 

当你可以使用-

  • ERB:您必须传递- trim_mode选项才能使用它。
  • erubis:默认启用。

例子:

 begin ERB.new("<%= 'a' -%>\nb").result; rescue SyntaxError ; else raise; end ERB.new("<%= 'a' -%>\nb" , nil, '-') .result == 'ab' or raise Erubis::Eruby.new("<%= 'a' -%> \nb").result == 'ab' or raise 

什么-%确实:

  • ERB:删除下一个字符,如果是换行符。

  • erubis:

    • <% %> (without = )中, -是无用的,因为<% %><% -%>是相同的。 如果只包含空格, <% %>将删除当前行,否则不执行任何操作。

    • <%= -%> (with = )中:

      • 删除整行,如果它只包含空格
      • 否则,如果标签之前有一个非空格,并且之后只有空格,则删除之后的空白
      • 否则,在标签后面有一个非空格:什么都不做

例子:

 # Remove ERB.new("a \nb <% 0 -%>\nc", nil, '-').result == "a \nb c" or raise # Don't do anything: not followed by newline, but by space: ERB.new("a\n<% 0 -%> \nc", nil, '-').result == "a\nb \nc" or raise # Remove the current line because only whitesapaces: Erubis::Eruby.new(" <% 0 %> \nb").result == 'b' or raise # Same as above, thus useless because longer. Erubis::Eruby.new(" <% 0 -%> \nb").result == 'b' or raise # Don't do anything because line not empty. Erubis::Eruby.new("a <% 0 %> \nb").result == "a \nb" or raise Erubis::Eruby.new(" <% 0 %> a\nb").result == " a\nb" or raise Erubis::Eruby.new(" <% 0 -%> a\nb").result == " a\nb" or raise # Don't remove the current line because of `=`: Erubis::Eruby.new(" <%= 0 %> \nb").result == " 0 \nb" or raise # Remove the current line even with `=`: Erubis::Eruby.new(" <%= 0 -%> \nb").result == " 0b" or raise # Remove forward only because of `-` and non space before: Erubis::Eruby.new("a <%= 0 -%> \nb").result == "a 0b" or raise # Don't do anything because non-whitespace forward: Erubis::Eruby.new(" <%= 0 -%> a\nb").result == " 0 a\nb" or raise 

什么%-做:

  • ERB:在标签之前和之前的换行符之后删除空格,但是只有在之前只有空格才能删除。

  • erubis:无用,因为<%- %><% %> (without = )相同,所以不能和=一起使用,这是唯一可以使用-%情况。 所以不要使用这个。

例子:

 # Remove ERB.new("a \n <%- 0 %> b\nc", nil, '-').result == "a \nb\nc" or raise # b is not whitespace: do nothing: ERB.new("a \nb <%- 0 %> c\nd", nil, '-').result == "a \nb c\nd" or raise 

什么%--%一起做

两种效果的确切组合。

我已经添加了<%%文字标记分隔符作为这个的答案,因为它的默默无闻。 这将告诉erb不要解释js应用程序所需的标记的<%部分,如显示chart.js工具提示等。

关于ERB的一切可以在这里find: https : //docs.puppet.com/puppet/latest/reference/lang_template_erb.html#tags

这些用于轨道上的ruby

<%%>: –

<%%>标记用于执行不返回任何内容的Ruby代码,例如条件,循环或块。 例如: –

 <h1>Names of all the people</h1> <% @people.each do |person| %> Name: <%= person.name %><br> <% end %> 

<%=%>: –

用来显示内容。

 Name: <%= person.name %><br> 

<% – %>: –

Rails扩展了ERB,所以你可以简单地通过在Rails模板中添加尾部连字符来标记新行

<%#%>: –

注释掉代码

 <%# WRONG %> Hi, Mr. <% puts "Frodo" %>