ChatGPT解决这个技术问题 Extra ChatGPT

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

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

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

每一个的用途是什么?

你在这里得到了一些很好的答案。另请注意,Haml 通常是 ERb 的更好替代品。
是的,它比 ERb 更容易处理
@Ciro Santilli:尽管年代久远,但这似乎比您的参考文献更完整。我投票关闭那些作为这个骗局的人..
<%= %><%= -%> 不同:只有后者会删除尾随空格。

N
Nil
<% %>

执行括号内的 ruby 代码。

<%= %>

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

<%== %>

等价于 <%= raw %>。将某些内容逐字打印(即没有转义)到 erb 文件中。 (取自 Ruby on Rails Guides。)

<% -%>

避免表达式后换行。

<%# %>

注释掉括号内的代码;不发送给客户端(与 HTML 注释相反)。

有关 ERB 的更多信息,请访问 Ruby Doc


我在代码中的某个地方遇到了这个变体 else <%== %> 有人知道它是什么吗?
双相等意味着字符串没有被转义,就像在 raw 中一样。
Rails 不使用标准库 ERB:它使用 erubis:github.com/rails/rails/issues/16766#issuecomment-54148778
但是...但是... <%# 只是一个普通的 <%,后面有一个 Ruby 注释 #.... 是的,认为它很特别很有趣,但它不只是一个 ERB成语而不是特殊的句法结构?
@QPaysTaxes 对此感到抱歉,您是对的...例如,如果您有多行 ERB <%...%>,则 <%#...%> 将其 all 注释掉,如果它是则不会这样做只是一个普通的注释(即它只会注释掉它所在的行)。
Y
Yeonho

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

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

<%# %> 是 ERB 评论

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


我没有看到打开 <%- 对前导空格有任何作用,而且我没有看到它记录在任何地方。您确定吗?也许这是一种不同的ERB。 stdlib 文档中没有显示任何选项。
@AndrewVit - 从这个答案中引用的页面(ActionView::Base docs page):“<%- and -%> 抑制前导和尾随空格,包括尾随换行符,并且可以与 <% 和 %> 互换使用。 "
如何抑制 <%= %> 的前导空格?
C
Community

Rails 默认使用 stdlib's ERB,它使用 erubis。来源:this dev's commentActionView's gemspecaccepted merge request I did while writing this

它们之间存在 行为差异,尤其是在连字符运算符 %--% 的工作方式上。

文档很少,Where is Ruby's ERB format "officially" defined? 因此以下是经验性结论。

所有测试都假设:

require 'erb'
require 'erubis'

何时可以使用 -

ERB:您必须将 - 传递给 ERB.new 的 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:在 <% %> (没有 =)中, - 没用,因为 <% %> 和 <% -%> 是一样的。 <% %> 如果当前行仅包含空格,则删除它,否则不执行任何操作。 in <%= -%> (with =): 删除整行,如果它只包含空格 else,如果标签之前有一个非空格,并且只有 whitesapces 之后,删除 else 之后的空格,有一个标签后的非空格:什么都不做

在 <% %> (没有 =)中, - 没用,因为 <% %> 和 <% -%> 是相同的。 <% %> 如果当前行仅包含空格,则删除它,否则不执行任何操作。

in <%= -%> (with =): 删除整行,如果它只包含空格 else,如果标签之前有一个非空格,并且只有 whitesapces 之后,删除 else 之后的空格,有一个标签后的非空格:什么都不做

如果它只包含空格,则删除整行

否则,如果标签之前有一个非空格,并且之后只有 whitesapces,则删除后面的 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

%--% 一起做什么

两种效果的精确组合分别。


在第二行中,您写到 Rails 在链接到 erubis 时使用了 eruby。
@DanielJonsson 感谢您的报告:它本来是 erubis。有这么多版本疯了。更新。
c
chris

<% %> : 执行 ruby 代码

<%= %> :打印到 Erb 文件中。或者浏览器

<% -%> :避免表达式后换行。

<%# %> : ERB 注释


b
bkunzi01

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

更新(修复断开的链接)

现在可以在此处找到有关 ERB 的所有信息:https://puppet.com/docs/puppet/5.3/lang_template_erb.html#tags


此链接准确地回答了 OP
链接现已断开
更新了新链接!
H
HeadAndTail

这些在 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" %>

A
Aastha Kesarwani

<% %> 执行其中的代码但不打印结果,例如:
我们可以将它用于 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

<% -%> 它没有任何区别,因为它不打印任何内容,-%> 仅对 <%= -%> 有意义,这将避免换行。

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