¿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?

simo
fuente
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
1
posible duplicado de la diferencia entre -%> y%> en rieles para -%>, y stackoverflow.com/questions/3952403/… para <%=, stackoverflow.com/questions/3901619/… para <%#.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
@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.

auralbee
fuente
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
77
Rails no usa el stdlib ERB: usa erubis: github.com/rails/rails/issues/16766#issuecomment-54148778
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
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

yalestar
fuente
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.

Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
fuente
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
Neha Nakrani
fuente
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

bkunzi01
fuente
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" %>
Cabeza y cola
fuente
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.

Aastha Kesarwani
fuente