2011-01-08 18 views
19

Tengo una plantilla ERB para enviar un correo electrónico.Plantilla ERB que elimina la línea posterior

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

estoy tratando de eliminar la línea en blanco entre Name y Address cuando Phone está vacía.

resultado devuelto

Name: John Miller 

Address: X124 Dummy Lane, Dummy City, CA 

Resultado esperado

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

He intentado utilizar <%--%> etiquetas (para eliminar la nueva línea de fuga) sin ningún éxito.

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

¿Cómo soluciono este problema?

PD: I am on Rails 2.3.8.

Nota 1

En este momento estoy trabajando en torno al tema usando hackery rubí.

método de ayuda:

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

Ver código

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

Pero esto parece bastante torpe para mí. Estoy interesado en saber si alguien ha podido obtener el <%--%> trabajando en plantillas de vista de ERB.

Respuesta

5

Prueba esto:

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

Además, no sé si esto va a funcionar:

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

Si eso no funciona bien, esto debería hacer el truco:

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

Enfoque 1, 2 no funciona. La variación del 3er enfoque es lo que estoy usando actualmente. Mira mi pregunta actualizada. El problema es más acerca de por qué las etiquetas '<%--%>' no funcionan .. –

4

Tuve el mismo problema,

que era debido a los caracteres de espacio afer %>

Tal vez le ayudará a

François

+0

Sí, esa es una forma de perder saltos de línea: ponga todas sus instrucciones erb 'if' |' a menos '[...]' end' en una línea. A veces hago esto, pero no es muy legible para el mantenimiento. –

22

Para activar el modo de ajuste que tiene que una instancia del objeto de ERB con '-' como tercer parámetro

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

Curiosamente, ni la documentación 1.8 ni la 1.9 dicen nada sobre la opción '-'. Sin embargo, está ahí en el código.¿Alguien puede aclarar esto? 1.8: http://ruby-doc.org/stdlib-1.8.7/libdoc/erb/rdoc/ERB.html#method-c-new 1.9: http://ruby-doc.org/stdlib- 1.9.3/libdoc/erb/rdoc/ERB.html # method-c-new Fuente: http://ruby-doc.org/gems/docs/p/Pimki-1.8.200/ERB/Compiler.html# method-i-prepare_trim_mode – krukid

+2

@krukid: 2.1 ahora dice: http://ruby-doc.org/stdlib-2.1.1/libdoc/erb/rdoc/ERB.html, pero no es muy preciso sobre lo que hace. Pregunta relacionada: http://stackoverflow.com/questions/3801550/what-does-mean-in-ruby-on-rails-compared-to/25613037 –

4

Según los últimos carriles docs (http://guides.rubyonrails.org/v2.3.8/configuring.html#configuring-action-view):

ActionView :: TemplateHandlers :: ERB.erb_trim_mode proporciona el modo de recorte que utilizará ERB. Por defecto es '-'.

los que hacen referencia los documentos 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 -%> 

Así que todo lo que necesitará hacer es tener el guión en su etiqueta de cierre erb como -%>. Es posible que necesite jugar con el modo de recorte si está viendo resultados inesperados.

3

Mediante el uso de la opción '>', se omiten los saltos de línea para las líneas que terminan en%>

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

Eso significa que puede envolver el código Ruby dentro <%%> etiquetas, como de costumbre. Lamentablemente, no he encontrado una manera de eliminar los espacios antes de la etiqueta <% inicial.

8

Tuve que combinar las respuestas por willmcneilly, RobinBrouwer y fbo.

activar el modo de ajuste

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

Cambio a -%>

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

Y, por último, convertir de DOS a UNIX. He utilizado el siguiente en Vim:

:set fileformat=unix 
:w 
Cuestiones relacionadas