抑制 ERB 模板中的空格

Suppressing spaces in ERB template

为什么这会产生所需的输出(团队名称列表,以逗号分隔):

<% teams.each_with_index do |t,i| -%><%= ',' unless i == 0  -%>
    <%= link_to t.name, team_path(t) -%>
<%- end %>

输出:一、二、三

这不是:

<% teams.each_with_index do |t,i| -%>
    <%= ',' unless i == 0  -%>
    <%= link_to t.name, team_path(t) -%>
<%- end %>

输出:一、二、三

我的理解是“-%>”应该取消逗号前的 space。但显然我的理解(或Rails 4.2.0)是错误的。

否,如果 trim_mode-,则 ERB 忽略以 -%> 结尾的空行。

查看第一个代码及其输出:

require 'erb'

erb = ERB.new <<_, 0, '-'
<% teams.each_with_index do |t,i| -%>
<%= ',' unless i == 0  %> # here I have removed `-`
<%= t -%>
<%- end %>
_

teams = %w( India USA Brazil )
puts erb.result binding
# >> 
# >> India,
# >> USA,
# >> Brazil

现在看看下面代码中 -%>- 的效果:

require 'erb'

erb = ERB.new <<_, 0, '-'
<% teams.each_with_index do |t,i| -%>
<%= ',' unless i == 0  -%>
<%= t -%>
<%- end %>
_

teams = %w( India USA Brazil )
puts erb.result binding
# >> India,USA,Brazil

并且,

require 'erb'

erb = ERB.new <<_, 0, '-'
<% teams.each_with_index do |t,i| -%> <%= ',' unless i == 0  -%>
<%= t -%>
<%- end %>
_

teams = %w( India USA Brazil ) 
puts erb.result binding
# >>  India ,USA ,Brazil

我认为 ERB 方面没有任何东西可以去除 白色 spaces。摆脱这种情况的一种方法是调整 ERB 模板 本身。

require 'erb'

erb = ERB.new <<_, 0, '-'
<% teams.each_with_index do |t,i| -%><%= ',' unless i == 0  -%>
<%= t -%>
<%- end %>
_

teams = %w( India USA Brazil )
puts erb.result binding
# >> India,USA,Brazil

最简单的方法是:

<%= teams.map { |t| link_to t.name, team_path(t) }.join(', ').html_safe %>

这是关于第一个代码的一些推理

当您为每次迭代添加 - 时,

<% teams.each_with_index do |t,i| -%> 将被删除。现在下一个是 <%= ',' unless i == 0 -%>,第一次不会出现,但下一次迭代会出现。但是每次 , 都会没有尾随 space,因为它之前的 erb 标签被 [=15= 删除了].

这是关于第二个代码的一些推理

当您为每次迭代添加 - 时,

<% teams.each_with_index do |t,i| -%> 将被删除。现在下一行是 <%= ',' unless i == 0 -%>,第一次不会出现,但下一次迭代会出现。现在这有一些额外的缩进 space,这导致每个 space =67=]。 [单身space],