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

时间:2011-11-03 14:36:09

标签: ruby-on-rails ruby templates erb

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

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

每个人的用法是什么?

7 个答案:

答案 0 :(得分:435)

<% %>

在括号内执行ruby代码。

<%= %>

将某些内容打印到erb文件中。

<% -%>

表达后避免换行。

<%# %>

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

访问Ruby Doc了解有关ERB的更多信息。

答案 1 :(得分:85)

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

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

<%# %>是ERB评论

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

答案 2 :(得分:46)

Rails默认使用stdlib's ERB,它使用erubis。来源:this dev's commentActionView's gemspecaccepted merge request I did while writing this

之间存在行为差异,尤其是连字符运算符%--%的工作原理。

文档很少,Where is Ruby's ERB format "officially" defined?所以接下来是实证结论。

所有测试都假设:

require 'erb'
require 'erubis'

何时可以使用-

  • ERB:您必须将-传递给trim_mode的{​​{1}}选项才能使用它。
  • erubis:默认启用。

示例:

ERB.new

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

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

  • erubis:

      -%中{li>

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

      <% %>中的
    • <%= -%>):

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

示例:

=

# Remove ERB.new("a \nb <% 0 -%>\n c", 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:无用,因为%-<%- %>相同(没有<% %>),这不能与=一起使用,=是唯一的情况-%可能很有用。所以永远不要使用它。

示例:

# Remove
ERB.new("a \n  <%- 0 %> b\n c", nil, '-').result == "a \n b\n c" or raise

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

%--%共同做什么

两种效果的确切组合分开。

答案 3 :(得分:6)

由于其含糊不清,我已添加了<%%文字标记分隔符作为答案。这将告诉erb不要解释js应用程序所需的标签的<%部分,例如显示chart.js工具提示等。

更新(修复损坏的链接)

现在可以在此处找到有关ERB的所有信息: https://puppet.com/docs/puppet/5.3/lang_template_erb.html#tags

答案 4 :(得分:4)

  • <% %>:执行红宝石代码
  • <%= %>:打印到Erb文件中。或浏览器
  • <% -%>:避免在表达式后换行。
  • <%# %>:ERB评论

答案 5 :(得分:1)

这些用于轨道上的红宝石: -

&lt; %%&gt; : -

&lt; %%&gt;标签用于执行不返回任何内容的Ruby代码,例如条件,循环或块。例如: -

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

&lt;%=%&gt; : -

用于显示内容。

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

&lt;% - %&gt;: -

Rails扩展了ERB,因此只需在Rails模板中为标记添加尾部连字符就可以抑制换行

&lt;%#%&gt;: -

注释掉代码

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

答案 6 :(得分:1)

<% %>执行其中的代码但不打印结果,例如:
我们可以在erb文件中将其用于if else。

<% temp = 1 %>
<% if temp == 1%>
  temp is 1
<% else %>
  temp is not 1
<%end%>  

将打印temp is 1

<%= %>执行代码并打印输出,例如:
我们可以打印rails变量的值。

<% temp = 1 %>
<%= temp %>  

将打印1

<% -%>没有任何区别,因为它不会打印任何内容,-%>只对<%= -%>有意义,这样可以避免换行。

<%# %>将注释掉此中编写的代码。