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

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

每一种的用途是什么?


当前回答

这些在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不要解释标签的<%部分,这对于js应用程序(如显示chart.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" %>

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代码,但不输出结果(例如if语句)。这两个是一样的。

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

<%# %>是ERB注释

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

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

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

打印temp是否为1


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

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

将打印1


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


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