Quelle est la différence entre <%, <% =, <% # et -%> dans ERB dans Rails?

368

Quelqu'un peut-il décrire l'utilisation des caractères suivants qui sont utilisés dans le fichier ERB:

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

quelle est l'utilité de chacun?

simo
la source
1
Vous avez ici d'excellentes réponses. Notez également que Haml est souvent une alternative supérieure à ERb.
Marnen Laibow-Koser
1
Oui, c'est beaucoup plus facile à gérer que ERb
simo
1
doublon possible de Différence entre -%> et%> dans les rails pour -%>, et stackoverflow.com/questions/3952403/… pour <%=, stackoverflow.com/questions/3901619/… pour <%#.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
@Ciro Santilli: Malgré l'âge, celui-ci semble plus complet que vos références. Je vote pour les fermer en tant que dupes de celui-ci ..
Brad Werth
<%= %>et <%= -%>sont différents: seul ce dernier supprime les espaces de fin.
illusionniste

Réponses:

476
<% %>

Exécute le code ruby ​​entre crochets.

<%= %>

Imprime quelque chose dans le fichier erb.

<% -%>

Évite le saut de ligne après l'expression.

<%# %>

Commente le code entre crochets; non envoyé au client (par opposition aux commentaires HTML).

Visitez Ruby Doc pour plus d'informations sur ERB.

auralbee
la source
17
j'ai rencontré quelque part dans le code cette variante sinon <% ==%> quelqu'un sait-il de quoi il s'agit?
okliv
38
Le double égal signifie que la chaîne n'est pas échappée, comme dans raw.
Richard_G
7
Rails n'utilise pas l'erb stdlib: il utilise erubis: github.com/rails/rails/issues/16766#issuecomment-54148778
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
3
Mais ... mais ... <%#c'est juste un normal <%avec un commentaire Ruby #juste après ... Oui, c'est amusant de penser que c'est quelque chose de spécial, mais n'est-ce pas simplement un idiome ERB plutôt qu'une construction syntaxique spéciale?
BalinKingOfMoria réintègre les CM
6
@QPaysTaxes désolé, vous avez raison ... Par exemple, si vous avez un ERB multiligne <%...%>, <%#...%>commente tout cela, ce qu'il ne ferait pas si c'était juste un commentaire normal (c'est-à-dire qu'il ne ferait que commenter la ligne c'est en marche).
BalinKingOfMoria réintègre les CM le
86

<% %>et <%- and -%>sont pour n'importe quel code Ruby, mais ne produisent pas les résultats (par exemple, si les instructions). les deux sont les mêmes.

<%= %> sert à produire les résultats du code Ruby

<%# %> est un commentaire ERB

Voici un bon guide: http://api.rubyonrails.org/classes/ActionView/Base.html

yalestar
la source
Je ne vois pas que l'ouverture <%-fait quoi que ce soit pour le premier espace blanc, et je ne le vois documenté nulle part. Êtes-vous sûr de cela? C'est peut-être une saveur différente d'ERB. Il n'y a aucune option indiquée pour cela sur les documents stdlib.
Andrew Vit
1
@AndrewVit - À partir de la page référencée dans cette réponse (page ActionView :: Base docs): "<% - et -%> supprime les espaces de début et de fin, y compris la nouvelle ligne de fin, et peut être utilisé de manière interchangeable avec <% et%>. "
Earl Jenkins du
6
Comment supprimer les espaces blancs de tête pour <% =%>?
Bogdan Gusiev
52

Rails n'utilise pas l' ERB de stdlib par défaut, il utilise erubis . Sources: le commentaire de ce développeur , gemspec d'ActionView , accepté la demande de fusion que j'ai faite en écrivant ceci .

Il existe des différences de comportement entre eux, en particulier sur la façon dont les opérateurs de trait d'union %-et -%fonctionnent.

La documentation est rare, où le format ERB de Ruby est-il "officiellement" défini? donc ce qui suit sont des conclusions empiriques.

Tous les tests supposent:

require 'erb'
require 'erubis'

Quand pouvez-vous utiliser -

  • ERB: vous devez passer -à l' trim_modeoption de ERB.newpour l'utiliser.
  • erubis: activé par défaut.

Exemples:

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'est -%- ce que:

  • ERB: supprime le caractère suivant s'il s'agit d'une nouvelle ligne.

  • erubis:

    • en <% %>(sans =), -est inutile car <% %>et <% -%>sont les mêmes. <% %>supprime la ligne actuelle si elle ne contient que des espaces blancs et ne fait rien d'autre.

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

      • supprimer toute la ligne si elle ne contient que des espaces blancs
      • sinon, s'il y a un non-espace avant la balise, et seulement des blancs après, supprimez les blancs qui viennent après
      • sinon, il y a un non-espace après la balise: ne rien faire

Exemples:

# 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'est %-- ce que:

  • ERB: supprimer les espaces blancs avant la balise et après les sauts de ligne précédents, mais uniquement s'il n'y a que des espaces blancs avant.

  • erubis: inutile parce que <%- %>c'est la même chose que <% %>(sans =), et cela ne peut pas être utilisé avec =qui est le seul cas où cela -%peut être utile. Alors n'utilisez jamais ça.

Exemples:

# 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 faire %-et -%faire ensemble

La combinaison exacte des deux effets séparément.

Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
la source
1
Sur la deuxième ligne, vous avez écrit que Rails utilise eruby lors de la liaison avec erubis.
Daniel Jonsson
1
@DanielJonsson merci pour le rapport: c'était censé être erubis. Aller fou avec tant de versions. Mise à jour.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
10
  • <% %> : Exécute le code rubis
  • <%= %>: Imprime dans le fichier Erb. Ou navigateur
  • <% -%> : Évite le saut de ligne après l'expression.
  • <%# %> : Commentaire ERB
Neha Nakrani
la source
7

J'ai ajouté le <%%délimiteur de balises littérales comme réponse à cela en raison de son obscurité. Cela indiquera à erb de ne pas interpréter la <%partie de la balise qui est nécessaire pour les applications js comme l'affichage des info-bulles chart.js, etc.

Mise à jour (lien cassé fixe)

Tout ce qui concerne ERB peut maintenant être trouvé ici: https://puppet.com/docs/puppet/5.3/lang_template_erb.html#tags

bkunzi01
la source
1
ce lien répond avec précision au PO
Ben Tinsley
Le lien est maintenant rompu
andreofthecape
Mis à jour avec le nouveau lien!
bkunzi01
3

Ceux-ci sont utilisés en rubis sur rails : -

<%%>: -

Les balises <%%> sont utilisées pour exécuter du code Ruby qui ne renvoie rien, comme des conditions, des boucles ou des blocs. Par exemple :-

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

<% =%>: -

utiliser pour afficher le contenu.

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

<% -%>: -

Rails étend ERB, de sorte que vous pouvez supprimer la nouvelle ligne simplement en ajoutant un trait d'union de fin aux balises dans les modèles Rails

<% #%>: -

commenter le code

<%# WRONG %>
Hi, Mr. <% puts "Frodo" %>
HeadAndTail
la source
1

<% %>exécute le code dedans mais n'imprime pas le résultat, par exemple:
Nous pouvons l'utiliser pour sinon dans un fichier erb.

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

Imprime temp is 1


<%= %>exécute le code et imprime également la sortie, par exemple:
Nous pouvons imprimer la valeur d'une variable rails.

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

Imprime 1


<% -%>Cela ne fait aucune différence car il n'imprime rien, -%>n'a de sens qu'avec <%= -%>, cela évitera une nouvelle ligne.


<%# %> commentera le code écrit dans ce document.

Aastha Kesarwani
la source