提问人:simo 提问时间:11/3/2011 最后编辑:simo 更新时间:8/11/2020 访问量:121031
Rails 中 ERB 中的 <%、<%=、<%# 和 -%> 有什么区别?
What is the difference between <%, <%=, <%# and -%> in ERB in Rails?
答:
<% %>
执行括号内的 ruby 代码。
<%= %>
将某些内容打印到 erb 文件中。
<%== %>
等效于 。将某些内容逐字打印(即不转义)到 erb 文件中。(摘自 Ruby on Rails Guides。<%= raw %>
<% -%>
避免在表达式后换行。
<%# %>
在括号内注释掉代码;不发送给客户端(与 HTML 注释相反)。
访问 Ruby Doc 了解有关 ERB 的更多信息。
评论
<%#
<%
#
<%...%>
<%#...%>
<% %>
并且用于任何 Ruby 代码,但不输出结果(例如 if 语句)。两者是一样的。<%- and -%>
<%= %>
用于输出 Ruby 代码的结果
<%# %>
是雇员再培训局的评论
这是一个很好的指南:http://api.rubyonrails.org/classes/ActionView/Base.html
评论
<%-
默认情况下,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:如果下一个字符是换行符,则删除该字符。
埃鲁比斯:
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
%
- 和 -%
一起做什么
两种效果的精确组合分别。
评论
由于它的晦涩难懂,我添加了文字标记分隔符作为答案。这将告诉 erb 不要解释 js 应用程序(如显示图表、.js、工具提示等)所必需的标签部分。<%%
<%
更新(修复了断开的链接)
关于再培训局的详情,现可在此查阅: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 文件中。或浏览器<% -%>
:避免在表达后换行。<%# %>
: 雇员再培训局评论
评论
-%>
<%=
<%#
<%= %>
和 是不同的:只有后者删除了尾随的空格。<%= -%>