Rails中ERB中的<%,<%=,<%#和 - %>有什么区别?

sim*_*imo 351 ruby templates ruby-on-rails erb

有人可以描述ERB文件中使用的以下字符的用法:

<%   %>
<%=  %>
<%  -%>
<%#  %>
Run Code Online (Sandbox Code Playgroud)

每个人的用法是什么?

aur*_*bee 448

<% %>
Run Code Online (Sandbox Code Playgroud)

在括号内执行ruby代码.

<%= %>
Run Code Online (Sandbox Code Playgroud)

将某些内容打印到erb文件中.

<% -%>
Run Code Online (Sandbox Code Playgroud)

表达后避免换行.

<%# %>
Run Code Online (Sandbox Code Playgroud)

注释括号内的代码; 没有发送到客户端(而不是HTML注释).

访问Ruby Doc获取有关ERB的更多信息.

  • 双重等于意味着字符串不会被转义,就像在raw中一样. (35认同)
  • 我在代码中的某个地方遇到了这个变体<%==%>有谁知道它是什么? (15认同)
  • Rails不使用stdlib ERB:它使用erubis:https://github.com/rails/rails/issues/16766#issuecomment-54148778 (7认同)
  • @QPaysTaxes我们对此深感抱歉,你是对的...例如,如果你有多ERB`<%...%>`,`<%#...%>`评论了_all_它,它止跌如果它只是一个正常的评论(即它只会注释掉它的行),那就不行了. (6认同)
  • 但是......但是......`<%#`只是一个普通的`<%`,后面有一个Ruby注释`#`....是的,认为这是特别的东西很有趣,但不是吗只是一个ERB成语而不是一个特殊的句法结构? (3认同)

yal*_*tar 86

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

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

<%# %> 是ERB的评论

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

  • 如何抑制<%=%>的前导空格? (5认同)

Cir*_*四事件 47

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

这里他们之间的行为差异,特别是关于如何连字号经营者%--%工作.

文档很少,Ruby的ERB格式在哪里"正式"定义?以下是经验性结论.

所有测试都假设:

require 'erb'
require 'erubis'
Run Code Online (Sandbox Code Playgroud)

什么时候可以使用 -

  • 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
Run Code Online (Sandbox Code Playgroud)

什么-%:

  • ERB:如果是换行符,则删除下一个字符.

  • erubis:

    • <% %>(没有=),-是没用的,因为<% %>并且<% -%>是相同的.<% %>如果它只包含空格,则删除当前行,否则不执行任何操作.

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

      • 如果它只包含空格,则删除整行
      • 否则,如果标签前面有非空格,并且只有whitesapces之后,请删除之后的空白
      • 否则,标签后面有一个非空格:什么都不做

例子:

# 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
Run Code Online (Sandbox Code Playgroud)

什么%-:

  • 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
Run Code Online (Sandbox Code Playgroud)

什么%--%做在一起

两种效果的确切组合分开.


bku*_*i01 7

我添加了<%%文字标记分隔符作为答案,因为它的含糊不清.这将告诉erb不要解释<%js应用程序所需的标记部分,例如显示chart.js工具提示等.

关于ERB的一切都可以在这里找到:https: //docs.puppet.com/puppet/latest/reference/lang_template_erb.html#tags


小智 7

  • <% %> :执行红宝石代码
  • <%= %>:打印到Erb文件中。或浏览器
  • <% -%> :避免在表达式后换行。
  • <%# %> :ERB评论