在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" %>