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


368

能否请您描述一下ERB文件中使用的以下字符的用法:

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

每个有什么用?


1
您在这里得到了一些很好的答案。还要注意,Haml通常是ERb的替代品。
Marnen Laibow-Koser

1
是的,它比ERb容易处理
simo 2012年


@Ciro Santilli:尽管年代久远,但是这似乎比您的参考文献更为完整。我将关闭这些内容的投票权。–
Brad Werth

<%= %><%= -%>有所不同:只有后者会删除结尾的空白。
魔术师

Answers:


476
<% %>

在括号内执行红宝石代码。

<%= %>

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

<% -%>

避免在表达式后换行。

<%# %>

在括号内注释掉代码;未发送给客户端(与HTML注释相反)。

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


17
我在代码中的某个地方遇到了这个变体,否则<%==%>有人知道吗?
okliv 2012年

38
双重等于表示未对字符串进行转义,如原始格式。
Richard_G 2014年


3
但是...但是... <%#只是正常现象<%#后面紧跟着Ruby注释....是的,觉得这很特别很有趣,但这不只是ERB习语而不是特殊的语法构造吗?
BalinKingOfMoria恢复CM 2015年

6
@QPaysTaxes我们对此深感抱歉,你是对的...例如,如果你有多ERB <%...%><%#...%>注释出所有的它,而如果这只是一个正常的评论(它不会做即它只会注释掉线它在)。
BalinKingOfMoria恢复CM

86

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

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

<%# %> 是ERB评论

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


我看不到开头<%-对于领先的空格没有任何作用,而且我也看不到任何地方有文档记录。你确定吗?也许这与ERB不同。在stdlib文档中没有显示任何选项。
Andrew Vit

1
@AndrewVit-在此答案(ActionView :: Base docs页面)中引用的页面中:“ <%-和-%>抑制前导和尾随空格,包括尾随换行符,并且可以与<%和%>互换使用。 ”
2013年

5
如何抑制<%=%>的前导空格?
Bogdan Gusiev 2014年

51

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

这里他们之间的行为差异,特别是关于如何连字号经营者%--%工作。

文档稀缺,Ruby的ERB格式在哪里“正式”定义?因此,以下是经验结论。

所有测试都假定:

require 'erb'
require 'erubis'

什么时候可以使用 -

  • ERB:您必须传递-trim_mode选项ERB.new才能使用它。
  • 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' -%>  \n b").result == 'a b' or raise

是什么-%呢:

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

  • erubis:

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

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

      • 如果只包含空格,则删除整行
      • 否则,如果标记之前没有空格,而在标记之后只有空格,则删除后面的空格
      • 否则,标记后会有一个非空格:什么都不做

例子:

# 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:无用,因为<%- %>它与<% %>(without =)相同,并且不能与之一起使用,=这是唯一-%有用的情况。所以永远不要使用这个。

例子:

# 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

什么%--%一起做

两种效果的确切组合分别存在。


1
在第二行中,您已经写到Rails在链接到erubis时会使用eruby。
丹尼尔·琼森2014年

1
@DanielJonsson感谢您的报告:它本来就是erubis。这么多版本都疯了。更新。
西罗Santilli郝海东冠状病六四事件法轮功


7

<%%由于其晦涩难懂,我添加了文字标签定界符作为对此的答案。这将告诉erb不要解释<%js应用程序(例如显示chart.js工具提示等)所需的标记部分。

更新(修复断开的链接)

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


1
此链接准确地回答了OP
Ben Tinsley

链接现在已断开
andreofthecape

更新了新链接!
bkunzi01 '19

3

这些是在轨道上的红宝石中使用的

<%%>:-

<%%>标记用于执行不返回任何条件(例如条件,循环或块)的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" %>

1

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

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

将打印 temp is 1


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

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

将打印 1


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


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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.