Шаблон ERB удаляет завершающую линию - PullRequest
22 голосов
/ 08 января 2011

У меня есть шаблон ERB для отправки электронного письма.

Name: <%= @user.name %>
<% if @user.phone.present? %>
Phone: <%= @user.phone %>
<% end %>
Address: <%= @user.address %>

Я пытаюсь удалить пустую строку между Name и Address, когда Phone пусто.

Возвращенный результат

Name: John Miller 

Address: X124 Dummy Lane, Dummy City, CA

Ожидаемый результат

Name: John Miller 
Address: X124 Dummy Lane, Dummy City, CA

Я пытался использовать теги <%--%> (чтобы удалить новый трейлингline) безуспешно.

Name: <%= @user.name %>
<%- if @user.phone.present? -%>
Phone: <%= @user.phone %>
<%- end -%>
Address: <%= @user.address -%>

Как обойти эту проблему?

PS: Я на Rails 2.3.8.

Примечание 1

Сейчас я работаю над этой проблемой, используя хакерство ruby.

Метод помощника:

def display_fields(names, user)
  names.collect do |name| 
    value = user.send(name)
    "#{name}: #{value}" unless value.blank?
  end.compact.join("\n")
end

Просмотреть код

<%= display_fields(["Name", "Phone", "Address"], @user) %>

Но это выглядит довольно неуклюже для меня.Мне интересно знать, удалось ли кому-нибудь <%--%> работать в шаблонах представления ERB.

Ответы [ 6 ]

25 голосов
/ 26 ноября 2012

Чтобы включить режим обрезки, вы должны создать экземпляр объекта ERB с '-' в качестве третьего параметра

ERB.new(template, nil, '-')
9 голосов
/ 03 января 2014

Мне пришлось объединить ответы по willmcneilly, RobinBrouwer и fbo.

включить режим обрезки

ERB.new(File.read(filename), nil, '-')

Изменить на -%>

<% $things.each do |thing| -%>
  <object name="<%= thing.name %>">
    <type><%= thing.name %></type>
  </object>
<% end -%>

И наконец, конвертировать из DOS в Unix.Я использовал следующее в Vim:

:set fileformat=unix
:w
5 голосов
/ 18 сентября 2013

По последним документам по рельсам (http://guides.rubyonrails.org/v2.3.8/configuring.html#configuring-action-view):

ActionView :: TemplateHandlers :: ERB.erb_trim_mode дает режим обрезки, который будет использоваться ERB. По умолчанию используется «-».

Они ссылаются на документы ERB (http://www.ruby -doc.org / stdlib-2.0.0 / libdoc / erb / rdoc / ERB.html # method-c-new )

If trim_mode is passed a String containing one or more of the following modifiers, ERB will adjust its code generation as listed:
%  enables Ruby code processing for lines beginning with %
<> omit newline for lines starting with <% and ending in %>
>  omit newline for lines ending in %>
-  omit blank lines ending in -%>

Так что все, что вам нужно сделать, это вставить тире в закрывающий тег erb, как -%>. Возможно, вам придется поиграть в режиме обрезки, если вы видите неожиданные результаты.

5 голосов
/ 08 января 2011

Попробуйте это:

Name: <%= @user.name %>
<% unless @user.phone.blank? -%>Phone: <%= @user.phone %><% end -%>
Address: <%= @user.address %>

Кроме того, не знаю, сработает ли это:

Name: <%= @user.name %>
<%= "Phone: #{@user.phone}" if @user.phone.present? -%>
Address: <%= @user.address %>

Если это тоже не сработает, это должно помочь:1007 *

Name: <%= @user.name %><%= "\nPhone: #{@user.phone}" if @user.phone.present? %>
Address: <%= @user.address %>
4 голосов
/ 02 августа 2011

У меня была такая же проблема,

это было связано с пробелами после %>

Может быть, это поможет вам

Франсуа

3 голосов
/ 20 ноября 2013

Используя опцию '>', вы пропустите новые строки для строк, заканчивающихся на%>

ERB.new(template, nil, '>')

Это означает, что вы можете заключить код Ruby в теги <%%>, как обычно.К сожалению, я не нашел способа удалить пробелы перед начальным тегом <%. </p>

...