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


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

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

¿Cuál es el uso de cada uno ?

Author: simo, 2011-11-03

7 answers

<% %>

Ejecuta el código ruby entre corchetes.

<%= %>

Imprime algo en el archivo erb.

<% -%>

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

<%# %>

Comenta el código entre corchetes; no se envía al cliente (a diferencia de los comentarios HTML).

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

 402
Author: auralbee,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-02-27 20:51:37

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

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

<%# %> es un comentario ERB

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

 81
Author: yalestar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-09-02 10:09:21

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

Hay diferencias de comportamiento entre ellos, en particular en cómo funcionan los operadores de guion %- y -%.

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

Todas las pruebas suponen:

require 'erb'
require 'erubis'

Cuando se puede utilizar -

  • ERB: debe pasar - a trim_mode opción de ERB.new usarlo.
  • 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

Qué hace -%:

  • ERB: elimina el siguiente carácter si se trata de 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 lo contrario.

    • {[27] {} En[17]} (con =):
      • elimine toda la línea si solo contiene espacios en blanco
      • de lo contrario, si hay un no-espacio antes de la etiqueta, y solo whitesapces después, elimine los espacios en blanco que vienen después de
      • de lo contrario, hay un no-espacio después de la etiqueta: do 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

Qué hace %-:

  • ERB: elimina los espacios en blanco antes de la etiqueta y después de las 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 = que es el único caso donde -% puede ser útil. Así que nunca use este.

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

Lo que %- y -% hacen juntos

La combinación exacta de ambos efectos por separado.

 42
Author: Ciro Santilli 新疆改造中心 六四事件 法轮功,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:02:48

He agregado el delimitador literal de etiquetas <%% 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 aplicaciones js como mostrar gráfico.js tooltips, etc.

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

 5
Author: bkunzi01,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-09 15:09:56

Estos se usan en ruby on rails :-

:-

Las etiquetas se utilizan para ejecutar código Ruby que no devuelve nada, como condiciones, bucles o bloques. Eg: -

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

:-

Use para mostrar el contenido .

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

:-

Rails extiende ERB, por lo que puede suprimir la nueva línea simplemente agregando un guion final a las etiquetas en las plantillas de Rails

:-

Comenta el código

<%# WRONG %>
Hi, Mr. <% puts "Frodo" %>
 1
Author: HeadAndTail,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-12 14:30:21
  • <% %>: 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 ERB
 1
Author: Neha Nakrani,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-23 05:31:35

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

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

Se imprimirá temp is 1


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

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

Se imprimirá 1


<% -%> No hace ninguna diferencia ya que no imprime nada, -%> solo tiene sentido con <%= -%>, esto evitará un nuevo alinear.


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

 0
Author: Aastha Kesarwani,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-15 10:21:03