请问有谁能描述一下在雇员再就业表文件中使用的下列字符的用法:

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

每一种的用途是什么?


当前回答

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

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

Ruby的ERB格式“正式”定义在哪里?下面是经验结论。

所有测试假设:

require 'erb'
require 'erubis'

当你可以使用-

ERB:必须传递ERB的- to 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: 在<% %>(没有=)中,-是无用的,因为<% %>和<% -%>是相同的。<% %>如果当前行只包含空格,则删除该行,否则不执行任何操作。 在<%= -%> (with =)中: 如果整行只包含空格,则删除整行 否则,如果标签之前有一个非空格,并且后面只有空白,则删除后面的空白 否则,标签后面有一个非空格:do nothing

例子:

# 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

%-和-%在一起做什么

两种效果的精确组合。

其他回答

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

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

Ruby的ERB格式“正式”定义在哪里?下面是经验结论。

所有测试假设:

require 'erb'
require 'erubis'

当你可以使用-

ERB:必须传递ERB的- to 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: 在<% %>(没有=)中,-是无用的,因为<% %>和<% -%>是相同的。<% %>如果当前行只包含空格,则删除该行,否则不执行任何操作。 在<%= -%> (with =)中: 如果整行只包含空格,则删除整行 否则,如果标签之前有一个非空格,并且后面只有空白,则删除后面的空白 否则,标签后面有一个非空格:do nothing

例子:

# 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文件中。

<%== %>

相当于<%= raw %>。逐字打印(即w/o转义)到erb文件。(摘自Ruby on Rails指南)

<% -%>

避免在表达式后换行。

<%# %>

注释掉括号内的代码;不发送到客户端(相对于HTML注释)。

访问Ruby Doc了解更多关于雇员再培训局的信息。

我添加了<%%文字标记分隔符作为答案,因为它是模糊的。这将告诉erb不要解释标签的<%部分,这对于js应用程序(如显示chart.js工具提示等)是必要的。

更新(修复断开链接)

有关雇员再培训局的资料,可在此查阅: https://puppet.com/docs/puppet/5.3/lang_template_erb.html#tags

<% %>:执行ruby代码 <%= %>:打印到Erb文件。或浏览器 <% -%>:避免在表达式后换行。 <%# %>: ERB注释

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

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

打印temp是否为1


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

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

将打印1


<% -%>没有区别,因为它不打印任何东西,-%>只适用于<%= -%>,这将避免新行。


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