抑制ERB模板中的空格

时间:2015-03-03 16:11:12

标签: ruby-on-rails erb

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

<% 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 %>

输出:一,二,三

我的理解是&#34; - %&gt;&#34;应该在逗号之前压缩空格。但显然我的理解(或Rails 4.2.0)是错误的。

1 个答案:

答案 0 :(得分:3)

不,如果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方面有任何内容可以删除空格。摆脱这种情况的一种方法是调整 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

Railish方式是:

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

以下是关于第一个代码的推理

当您为每次迭代添加<% teams.each_with_index do |t,i| -%>时,

-将被删除。现在下一个是<%= ',' unless i == 0 -%>,它不会在第一时间出现,但是接下来的迭代。但每次,都没有尾随空格,因为之前的 erb 标记已被-删除。

以下是关于第二个代码的推理

当您为每次迭代添加<% teams.each_with_index do |t,i| -%>时,

-将被删除。现在下一行是<%= ',' unless i == 0 -%>,它不是第一次出现,而是下一次迭代。现在这有一些额外的缩进 space ,这会在每个 之前产生空格 [单一空间],