Ответ 1
Чтобы включить режим обрезки, вам необходимо создать экземпляр объекта ERB с помощью "-" в качестве третьего параметра
ERB.new(template, nil, '-')
У меня есть шаблон 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.
Чтобы включить режим обрезки, вам необходимо создать экземпляр объекта ERB с помощью "-" в качестве третьего параметра
ERB.new(template, nil, '-')
Мне пришлось объединить ответы с помощью 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
Попробуйте следующее:
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 %>
У меня была та же проблема,
это было связано с символами пробела afer %>
Возможно, это поможет вам
Франсуа
В соответствии с последними рельсами 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, например -%>
. Возможно, вам придется играть в режиме обрезки, если вы видите неожиданные результаты.
Используя опцию ' > ', вы опустите строки новой строки для строк, заканчивающихся на% >
ERB.new(template, nil, '>')
Это означает, что вы можете перенести Ruby-код внутри <%% > тегов, как обычно. К сожалению, я не нашел способ удалить пробелы перед началом тега% lt.%.