Подтвердить что ты не робот

Шаблон ERB, удаляющий трейлинг-линию

У меня есть шаблон 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

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

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

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

PS: я на Rails 2.3.8.

Примечание 1

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

Вспомогательный метод:

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.

4b9b3361

Ответ 1

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

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

Ответ 2

Мне пришлось объединить ответы с помощью 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

Ответ 3

Попробуйте следующее:

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

Если это тоже не сработает, это должно сделать трюк:

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

Ответ 4

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

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

Возможно, это поможет вам

Франсуа

Ответ 5

В соответствии с последними рельсами docs (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, например -%>. Возможно, вам придется играть в режиме обрезки, если вы видите неожиданные результаты.

Ответ 6

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

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

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