<%, <%=, <%#和-%>在ERB在Rails?

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

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

每一种的用途是什么?

116632 次浏览
<% %>

执行括号内的ruby代码。

<%= %>

将内容打印到erb文件中。

<%== %>

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

<% -%>

避免在表达式后换行。

<%# %>

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

访问Ruby文档获取更多关于雇员再培训局的信息。

<% %><%- and -%>适用于任何Ruby代码,但不输出结果(例如if语句)。这两个是一样的。

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

<%# %>是ERB注释

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

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

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

文件是稀缺的,ruby的ERB格式“正式”在哪里?定义?所以下面是经验的结论。

所有测试假设:

require 'erb'
require 'erubis'

当你可以使用-

  • ERB:必须将-传递给ERB.newtrim_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:如果下一个字符是换行符,则删除它。

  • < p > erubis:

    • <% %>中(没有=), -是无用的,因为<% %><% -%>是相同的。<% %>删除当前行,如果它只包含空格,其他什么都不做。

    • in <%= -%> (with =):

      • 如果整行只包含空格,则删除整行
      • 否则,如果标签之前有一个非空格,并且后面只有空白,则删除后面的空白
      • 否则,标签后面有一个非空格:do nothing
      • 李< / ul > < / > 李< / ul > < / >

      例子:

      # 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应用程序(如显示chart.js工具提示等)是必要的。

更新(修复断开链接)

关于雇员再培训局的一切现在都可以在这里找到: https://puppet.com/docs/puppet/5.3/lang_template_erb.html#tags < / p >

这些在ruby on rails中使用: -

% %>:-

% %>标记用于执行不返回任何东西的Ruby代码,例如条件、循环或块。如:-

<h1>Names of all the people</h1>
<% @people.each do |person| %>
Name: <%= person.name %><br>
<% end %>

<%= %>:-

用于显示内容。

Name: <%= person.name %><br>

& lt; % - % >: -

Rails扩展了ERB,因此只需在Rails模板中的标记后面添加一个连字符,就可以删除换行符

& lt; % # % >: -

注释掉代码

<%# WRONG %>
Hi, Mr. <% puts "Frodo" %>

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

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

将打印temp is 1


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

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

将打印1


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


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

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