有人可以描述 ERB 文件中使用的以下字符的用法:
<% %>
<%= %>
<% -%>
<%# %>
每一个的用途是什么?
-%>
的 Difference between -%> and %> in rails 和 <%=
的 stackoverflow.com/questions/3952403/… 和 <%#
的 stackoverflow.com/questions/3901619/… 可能重复。
<%= %>
和 <%= -%>
不同:只有后者会删除尾随空格。
<% %>
执行括号内的 ruby 代码。
<%= %>
将某些内容打印到 erb 文件中。
<%== %>
等价于 <%= raw %>
。将某些内容逐字打印(即没有转义)到 erb 文件中。 (取自 Ruby on Rails Guides。)
<% -%>
避免表达式后换行。
<%# %>
注释掉括号内的代码;不发送给客户端(与 HTML 注释相反)。
有关 ERB 的更多信息,请访问 Ruby Doc。
<% %>
和 <%- and -%>
用于任何 Ruby 代码,但不输出结果(例如 if 语句)。两者是一样的。
<%= %>
用于输出 Ruby 代码的结果
<%# %>
是 ERB 评论
这是一个很好的指南:http://api.rubyonrails.org/classes/ActionView/Base.html
<%-
对前导空格有任何作用,而且我没有看到它记录在任何地方。您确定吗?也许这是一种不同的ERB。 stdlib 文档中没有显示任何选项。
Rails 默认不使用 stdlib's ERB,它使用 erubis。来源:this dev's comment、ActionView's gemspec、accepted merge request I did while writing this。
它们之间存在 行为差异,尤其是在连字符运算符 %-
和 -%
的工作方式上。
文档很少,Where is Ruby's ERB format "officially" defined? 因此以下是经验性结论。
所有测试都假设:
require 'erb'
require 'erubis'
何时可以使用 -
ERB:您必须将 - 传递给 ERB.new 的 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' -%> \n b").result == 'a b' or raise
-%
的作用:
ERB:如果是换行符,则删除下一个字符。
erubis:在 <% %> (没有 =)中, - 没用,因为 <% %> 和 <% -%> 是一样的。 <% %> 如果当前行仅包含空格,则删除它,否则不执行任何操作。 in <%= -%> (with =): 删除整行,如果它只包含空格 else,如果标签之前有一个非空格,并且只有 whitesapces 之后,删除 else 之后的空格,有一个标签后的非空格:什么都不做
在 <% %> (没有 =)中, - 没用,因为 <% %> 和 <% -%> 是相同的。 <% %> 如果当前行仅包含空格,则删除它,否则不执行任何操作。
in <%= -%> (with =): 删除整行,如果它只包含空格 else,如果标签之前有一个非空格,并且只有 whitesapces 之后,删除 else 之后的空格,有一个标签后的非空格:什么都不做
如果它只包含空格,则删除整行
否则,如果标签之前有一个非空格,并且之后只有 whitesapces,则删除后面的 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
%-
和 -%
一起做什么
两种效果的精确组合分别。
<% %> : 执行 ruby 代码
<%= %> :打印到 Erb 文件中。或者浏览器
<% -%> :避免表达式后换行。
<%# %> : ERB 注释
我添加了 <%%
文字标记分隔符作为对此的答案,因为它晦涩难懂。这将告诉 erb 不要解释标记的 <%
部分,这对于显示 chart.js 工具提示等 js 应用程序是必需的。
更新(修复断开的链接)
现在可以在此处找到有关 ERB 的所有信息:https://puppet.com/docs/puppet/5.3/lang_template_erb.html#tags
这些在 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" %>
<% %>
执行其中的代码但不打印结果,例如:
我们可以将它用于 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
<% -%>
它没有任何区别,因为它不打印任何内容,-%>
仅对 <%= -%>
有意义,这将避免换行。
<%# %>
将注释掉其中编写的代码。
<%#
只是一个普通的<%
,后面有一个 Ruby 注释#
.... 是的,认为它很特别很有趣,但它不只是一个 ERB成语而不是特殊的句法结构?<%...%>
,则<%#...%>
将其 all 注释掉,如果它是则不会这样做只是一个普通的注释(即它只会注释掉它所在的行)。