¿Cuál es la diferencia entre <%, <% =, <% # y -%> en ERB en Rails?


368

¿Puede alguien describir el uso de los siguientes caracteres que se utilizan en el archivo ERB:

<%   %>
<%=  %>
<%  -%>
<%#  %>

¿Cuál es el uso de cada uno?


1
Tienes algunas respuestas geniales aquí. También tenga en cuenta que Haml es a menudo una alternativa superior a ERb.
Marnen Laibow-Koser

1
Sí, es mucho más fácil tratar con ERb
simo


@Ciro Santilli: A pesar de la edad, este parece más completo que tus referencias. Estoy votando para cerrarlos como engañados de este ..
Brad Werth

<%= %>y <%= -%>son diferentes: solo este último elimina los espacios en blanco finales.
ilusionista

Respuestas:


476
<% %>

Ejecuta el código ruby ​​dentro de los corchetes.

<%= %>

Imprime algo en el archivo erb.

<% -%>

Evita el salto de línea después de la expresión.

<%# %>

Comenta el código entre paréntesis; no enviado al cliente (a diferencia de los comentarios HTML).

Visite Ruby Doc para más información sobre ERB.


17
Me he encontrado en algún lugar del código de esta variante. <% ==%> ¿Alguien sabe qué es?
okliv

38
El doble igual significa que la cadena no se escapa, como en raw.
Richard_G


3
Pero ... pero ... <%#es normal <%con un comentario de Ruby #justo después ... Sí, es divertido pensar que es algo especial, pero ¿no es solo un lenguaje ERB en lugar de una construcción sintáctica especial?
BalinKingOfMoria Reinstale CMs el

66
@ QPaysTaxes lo siento, tienes razón ... Por ejemplo, si tienes ERB multilínea <%...%>, <%#...%>comenta todo , lo que no haría si fuera solo un comentario normal (es decir, solo comentaría la línea esta encendido).
BalinKingOfMoria Reinstale CMs el

86

<% %>y <%- and -%>son para cualquier código Ruby, pero no muestra los resultados (por ejemplo, declaraciones if). Los dos son iguales.

<%= %> es para generar los resultados del código Ruby

<%# %> es un comentario de ERB

Aquí hay una buena guía: http://api.rubyonrails.org/classes/ActionView/Base.html


No veo que la apertura <%-haga nada para liderar espacios en blanco, y no lo veo documentado en ningún lado. ¿Estás seguro de eso? Tal vez es un sabor diferente de ERB. No se muestra ninguna opción en los documentos stdlib.
Andrew Vit

1
@AndrewVit: desde la página a la que se hace referencia en esta respuesta (página ActionView :: Base docs): "<% - y -%> suprime los espacios en blanco iniciales y finales, incluida la nueva línea final, y se puede usar indistintamente con <% y%>. "
Earl Jenkins el

66
¿Cómo suprimir los espacios en blanco iniciales para <% =%>?
Bogdan Gusiev

52

Rails no usa el ERB de stdlib por defecto, usa erubis . Fuentes: el comentario de este desarrollador , gemspec de ActionView , aceptó la solicitud de fusión que hice mientras escribía esto .

No son las diferencias de comportamiento entre ellos, en particular, sobre cómo los operadores de guión %-y -%trabajo.

La documentación es escasa. ¿Dónde se define "oficialmente" el formato ERB de Ruby? Entonces, lo que sigue son conclusiones empíricas.

Todas las pruebas suponen:

require 'erb'
require 'erubis'

Cuando puedes usar -

  • ERB: debes pasar -a la trim_modeopción de ERB.newusarlo.
  • erubis: habilitado por defecto.

Ejemplos:

begin ERB.new("<%= 'a' -%>\nb").result; rescue SyntaxError ; else raise; end
ERB.new("<%= 'a' -%>\nb"  , nil, '-') .result == 'ab'  or raise
Erubis::Eruby.new("<%= 'a' -%>  \n b").result == 'a b' or raise

Que -%hace:

  • ERB: elimina el siguiente carácter si es una nueva línea.

  • erubis:

    • en <% %>(sin =), -es inútil porque <% %>y <% -%>son lo mismo. <% %>elimina la línea actual si solo contiene espacios en blanco y no hace nada de otra manera.

    • en <%= -%>(con =):

      • eliminar toda la línea si solo contiene espacios en blanco
      • de lo contrario, si hay un espacio antes de la etiqueta, y solo espacios en blanco después, elimine los espacios en blanco que vienen después
      • de lo contrario, no hay espacio después de la etiqueta: no hacer nada

Ejemplos:

# Remove
ERB.new("a \nb <% 0 -%>\n c", nil, '-').result == "a \nb  c" or raise

# Don't do anything: not followed by newline, but by space:
ERB.new("a\n<% 0 -%> \nc", nil, '-').result == "a\nb \nc" or raise

# Remove the current line because only whitesapaces:
Erubis::Eruby.new(" <% 0 %> \nb").result == 'b' or raise

# Same as above, thus useless because longer.
Erubis::Eruby.new(" <% 0 -%> \nb").result == 'b' or raise

# Don't do anything because line not empty.
Erubis::Eruby.new("a <% 0 %> \nb").result == "a  \nb" or raise
Erubis::Eruby.new(" <% 0 %> a\nb").result == "  a\nb" or raise
Erubis::Eruby.new(" <% 0 -%> a\nb").result == "  a\nb" or raise

# Don't remove the current line because of `=`:
Erubis::Eruby.new(" <%= 0 %> \nb").result == " 0 \nb" or raise

# Remove the current line even with `=`:
Erubis::Eruby.new(" <%= 0 -%> \nb").result == " 0b"   or raise

# Remove forward only because of `-` and non space before:
Erubis::Eruby.new("a <%= 0 -%> \nb").result == "a 0b"   or raise

# Don't do anything because non-whitespace forward:
Erubis::Eruby.new(" <%= 0 -%> a\nb").result == " 0 a\nb"   or raise

Que %-hace:

  • ERB: elimine espacios en blanco antes de la etiqueta y después de nuevas líneas anteriores, pero solo si solo hay espacios en blanco antes.

  • erubis: inútil porque <%- %>es lo mismo que <% %>(sin =), y esto no se puede usar con lo =cual es el único caso donde -%puede ser útil. Así que nunca uses esto.

Ejemplos:

# Remove
ERB.new("a \n  <%- 0 %> b\n c", nil, '-').result == "a \n b\n c" or raise

# b is not whitespace: do nothing:
ERB.new("a \nb  <%- 0 %> c\n d", nil, '-').result == "a \nb   c\n d" or raise

Que %-y -%hacer juntos

La combinación exacta de ambos efectos por separado.


1
En la segunda línea ha escrito que Rails usa eruby mientras se vincula a erubis.
Daniel Jonsson

1
@DanielJonsson gracias por el informe: estaba destinado a ser erubis. Volverse loco con tantas versiones. Actualizado.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

10
  • <% %> : Ejecuta el código ruby
  • <%= %>: Imprime en el archivo Erb. O navegador
  • <% -%> : Evita el salto de línea después de la expresión.
  • <%# %> : Comentario de ERB

7

He agregado el <%%delimitador de etiqueta literal como respuesta a esto debido a su oscuridad. Esto le dirá a erb que no interprete la <%parte de la etiqueta que es necesaria para las aplicaciones js, como mostrar información sobre herramientas chart.js, etc.

Actualización (enlace roto fijo)

Todo sobre ERB ahora se puede encontrar aquí: https://puppet.com/docs/puppet/5.3/lang_template_erb.html#tags


1
este enlace responde al OP con precisión
Ben Tinsley

El enlace ahora está roto
andreofthecape

Actualizado con el nuevo enlace!
bkunzi01

3

Estos se usan en rubí sobre rieles : -

<%%>: -

Las etiquetas <%%> se utilizan para ejecutar código Ruby que no devuelve nada, como condiciones, bucles o bloques. P.ej :-

<h1>Names of all the people</h1>
<% @people.each do |person| %>
  Name: <%= person.name %><br>
<% end %>

<% =%>: -

utilizar para mostrar el contenido.

Name: <%= person.name %><br>

<% -%>: -

Rails extiende ERB, para que pueda suprimir la nueva línea simplemente agregando un guión final a las etiquetas en las plantillas de Rails

<% #%>: -

comentar el código

<%# WRONG %>
Hi, Mr. <% puts "Frodo" %>

1

<% %>ejecuta el código allí pero no imprime el resultado, por ejemplo:
podemos usarlo para si no en un archivo erb.

<% temp = 1 %>
<% if temp == 1%>
  temp is 1
<% else %>
  temp is not 1
<%end%>  

Imprimirá temp is 1


<%= %>ejecuta el código y también imprime la salida, por ejemplo:
podemos imprimir el valor de una variable de rieles.

<% temp = 1 %>
<%= temp %>  

Imprimirá 1


<% -%>No hace ninguna diferencia ya que no imprime nada, -%>solo tiene sentido <%= -%>, esto evitará una nueva línea.


<%# %> comentará el código escrito dentro de esto.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.