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

What is the difference between <%, <%=, <%# and -%> in ERB in Rails?

提问人:simo 提问时间:11/3/2011 最后编辑:simo 更新时间:8/11/2020 访问量:121031

问:

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

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

每个的用途是什么?

Ruby-on-Rails Ruby 模板 ERB

评论

1赞 Marnen Laibow-Koser 11/4/2011
你在这里得到了一些很好的答案。另请注意,Haml 通常是 ERb 的更好替代品。
1赞 simo 6/3/2012
是的,它比 ERb 更容易处理
1赞 Ciro Santilli OurBigBook.com 9/2/2014
Rails 中 -%> 和 %> 之间的差值的可能重复,而 stackoverflow.com/questions/3952403/... 表示 , stackoverflow.com/questions/3901619/... 表示 。-%><%=<%#
0赞 Brad Werth 9/2/2014
@Ciro Santilli:尽管年代久远,但这个似乎比你的参考资料更完整。我投票关闭那些作为这个的骗子......
0赞 Shiva 9/3/2015
<%= %>和 是不同的:只有后者删除了尾随的空格。<%= -%>

答:

535赞 auralbee 11/3/2011 #1
<% %>

执行括号内的 ruby 代码。

<%= %>

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

<%== %>

等效于 。将某些内容逐字打印(即不转义)到 erb 文件中。(摘自 Ruby on Rails Guides<%= raw %>

<% -%>

避免在表达式后换行。

<%# %>

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

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

评论

18赞 okliv 7/12/2012
我在代码的某个地方遇到了这个变体 <%== %> 有谁知道它是什么?
40赞 Richard_G 3/25/2014
双等号表示字符串不会被转义,就像在 raw 中一样。
7赞 Ciro Santilli OurBigBook.com 9/2/2014
Rails 不使用 stdlib ERB:它使用 erubis: github.com/rails/rails/issues/16766#issuecomment-54148778
4赞 Joshua Grosso 12/10/2015
但。。。但。。。 只是一个普通的,后面跟着一个 Ruby 注释......是的,认为它很特别很有趣,但它不就是一个 ERB 习语而不是一个特殊的句法结构吗?<%#<%#
6赞 Joshua Grosso 1/12/2016
@QPaysTaxes对不起,你是对的......例如,如果您有 多行 ERB ,则注释掉所有注释,如果它只是一个普通注释(即它只会注释掉它所在的行),它就不会这样做。<%...%><%#...%>
94赞 yalestar 11/3/2011 #2

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

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

<%# %>是雇员再培训局的评论

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

评论

1赞 Andrew Vit 4/4/2013
我没有看到打开对前导空格有任何作用,也没有在任何地方看到它被记录下来。你确定吗?也许是ERB的不同味道。stdlib 文档上没有显示任何选项。<%-
1赞 Earl Jenkins 11/13/2013
@AndrewVit - 来自此答案中引用的页面(ActionView::Base 文档页面):“<%- 和 -%> 禁止前导和尾随空格,包括尾随换行符,并且可以与 <% 和 %> 互换使用。
6赞 Bogdan Gusiev 9/30/2014
如何抑制 <%= %> 的前导空格?
69赞 Ciro Santilli OurBigBook.com 9/2/2014 #3

默认情况下,Rails 使用 stdlib 的 ERB,它使用 erubis。来源:这个开发人员的评论ActionView 的 gemspec接受了我在写这篇文章时所做的合并请求

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

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

所有测试都假设:

require 'erb'
require 'erubis'

何时可以使用 -

  • ERB:您必须将其传递给选项才能使用它。-trim_modeERB.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:如果下一个字符是换行符,则删除该字符。

  • 埃鲁比斯:

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

    • 在 (和):<%= -%>=

      • 如果整行仅包含空格,则将其删除
      • 否则,如果标签前有非空格,而标签后只有 whitesapce,则删除后面的 whitespces
      • 否则,标签后面有一个非空格:不执行任何操作

例子:

# 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

%- 和 -% 一起做什么

两种效果的精确组合分别。

评论

1赞 Daniel Jonsson 11/11/2014
在第二行中,你写道 Rails 在链接到 erubis 时使用了 eruby。
1赞 Ciro Santilli OurBigBook.com 11/11/2014
@DanielJonsson感谢您的报告:它本来是 Erubis。这么多版本都发疯了。更新。
8赞 bkunzi01 6/9/2016 #4

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

更新(修复了断开的链接)

关于再培训局的详情,现可在此查阅:https://puppet.com/docs/puppet/5.3/lang_template_erb.html#tags

评论

1赞 Ben Tinsley 11/17/2017
此链接准确回答 OP
0赞 andreofthecape 4/29/2019
链接现已断开
0赞 bkunzi01 4/29/2019
使用新链接更新!
3赞 HeadAndTail 11/12/2017 #5

这些用于 ruby on rails :-

<% %> :-

<% %> 标签用于执行不返回任何内容的 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赞 Aastha Kesarwani 5/15/2018 #6

<% %>执行其中的代码,但不打印结果,例如:
我们可以在 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


<% -%>它没有区别,因为它不打印任何东西,只有有意义,这将避免换行。-%><%= -%>


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

11赞 user8739984 8/23/2018 #7
  • <% %>:执行 ruby 代码
  • <%= %>:打印到 Erb 文件中。或浏览器
  • <% -%>:避免在表达后换行。
  • <%# %>: 雇员再培训局评论