Was ist der Unterschied zwischen <%, <% =, <% # und -%> in ERB in Rails?


368

Kann jemand bitte die Verwendung der folgenden Zeichen beschreiben, die in der ERB-Datei verwendet werden:

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

Was nützt jeder?


1
Sie haben hier einige gute Antworten. Beachten Sie auch, dass Haml oft eine überlegene Alternative zu ERb ist.
Marnen Laibow-Koser

1
Ja, es ist viel einfacher als ERb
simo


@Ciro Santilli: Trotz des Alters scheint dieser vollständiger zu sein als Ihre Referenzen. Ich stimme dafür, diese als Dupes von diesem zu schließen.
Brad Werth

<%= %>und <%= -%>sind anders: nur letzteres entfernt nachgestellte Leerzeichen.
Illusionist

Antworten:


476
<% %>

Führt den Ruby-Code in den Klammern aus.

<%= %>

Druckt etwas in eine erb-Datei.

<% -%>

Vermeidet Zeilenumbrüche nach dem Ausdruck.

<%# %>

Kommentiert den Code in Klammern aus. nicht an den Client gesendet (im Gegensatz zu HTML-Kommentaren).

Besuchen Sie Ruby Doc für weitere Informationen zu ERB.


17
Ich habe irgendwo im Code diese Variante getroffen, sonst <% ==%> weiß jemand, was es ist?
okliv

38
Die doppelte Gleichheit bedeutet, dass die Zeichenfolge nicht wie in raw maskiert wird.
Richard_G


3
Aber ... aber ... <%#ist nur normal <%mit einem Ruby-Kommentar #direkt danach ... Ja, es macht Spaß zu denken, dass es etwas Besonderes ist, aber ist es nicht eher eine ERB-Sprache als ein spezielles syntaktisches Konstrukt?
BalinKingOfMoria CMs

6
@QPaysTaxes Entschuldigung, Sie haben Recht ... Wenn Sie beispielsweise einen mehrzeiligen ERB haben <%...%>, <%#...%>kommentieren Sie alles aus, was es nicht tun würde, wenn es nur ein normaler Kommentar wäre (dh es würde nur die Zeile auskommentieren ist Zustand).
BalinKingOfMoria CMs am

86

<% %>und <%- and -%>sind für jeden Ruby-Code, geben jedoch keine Ergebnisse aus (z. B. if-Anweisungen). die beiden sind gleich.

<%= %> dient zur Ausgabe der Ergebnisse von Ruby-Code

<%# %> ist ein ERB-Kommentar

Hier ist eine gute Anleitung: http://api.rubyonrails.org/classes/ActionView/Base.html


Ich sehe nicht, dass das Öffnen <%-etwas für führende Leerzeichen bewirkt, und ich sehe es nirgendwo dokumentiert. Bist du dir da sicher? Vielleicht ist es ein anderer Geschmack von ERB. In den stdlib-Dokumenten wird keine Option dafür angezeigt.
Andrew Vit

1
@AndrewVit - Auf der Seite, auf die in dieser Antwort verwiesen wird (ActionView :: Base-Dokumentenseite): "<% - und -%> unterdrücken führende und nachfolgende Leerzeichen, einschließlich der nachfolgenden Zeilenumbruch, und können austauschbar mit <% und%> verwendet werden. ""
Earl Jenkins

5
Wie kann man führende Leerzeichen für <% =%> unterdrücken?
Bogdan Gusiev

52

Rails ist nicht die Verwendung Erbsche stdlib standardmäßig verwendet es erubis . Quellen: Der Kommentar dieses Entwicklers , ActionViews Gemspec , akzeptierte die Zusammenführungsanforderung, die ich beim Schreiben dieses Artikels gestellt habe .

Es gibt Verhaltensunterschiede zwischen ihnen, insbesondere hinsichtlich der Funktionsweise der Bindestrichoperatoren %-und der Funktionsweise -%.

Dokumentation ist knapp. Wo ist Rubys ERB-Format "offiziell" definiert? Was folgt, sind empirische Schlussfolgerungen.

Alle Tests setzen voraus:

require 'erb'
require 'erubis'

Wann können Sie verwenden -

  • ERB: Sie müssen an -die trim_modeOption übergeben ERB.new, es zu verwenden.
  • erubis: standardmäßig aktiviert.

Beispiele:

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

Was -%macht:

  • ERB: Entfernen Sie das nächste Zeichen, wenn es sich um eine neue Zeile handelt.

  • erubis:

    • in <% %>(ohne =) -ist nutzlos, weil <% %>und <% -%>sind gleich. <% %>Entfernt die aktuelle Zeile, wenn sie nur Leerzeichen enthält, und führt nichts anderes aus.

    • in <%= -%>(mit =):

      • Entfernen Sie die gesamte Zeile, wenn sie nur Leerzeichen enthält
      • Andernfalls entfernen Sie die folgenden Whitespces, wenn vor dem Tag ein Leerzeichen steht und nur Whitesapces danach
      • Andernfalls steht nach dem Tag ein Leerzeichen: nichts tun

Beispiele:

# 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

Was %-macht:

  • ERB: Leerzeichen vor dem Tag und nach vorherigen Zeilenumbrüchen entfernen, jedoch nur, wenn zuvor nur Leerzeichen vorhanden sind.

  • erubis: nutzlos, weil <%- %>es dasselbe ist wie <% %>(ohne =), und dies kann nicht verwendet werden, =was der einzige Fall -%ist, in dem es nützlich sein kann. Also benutze das niemals.

Beispiele:

# 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

Was %-und -%zusammen machen

Die genaue Kombination beider Effekte getrennt.


1
In der zweiten Zeile haben Sie geschrieben, dass Rails beim Verknüpfen mit erubis eruby verwendet.
Daniel Jonsson

1
@ DanielJonsson danke für den Bericht: Es sollte erubis sein. Mit so vielen Versionen verrückt werden. Aktualisiert.
Ciro Santilli 法轮功 冠状 病 六四 事件 法轮功

10
  • <% %> : Führt den Ruby-Code aus
  • <%= %>: Druckt in Erb-Datei. Oder Browser
  • <% -%> : Vermeidet Zeilenumbrüche nach dem Ausdruck.
  • <%# %> : ERB-Kommentar

7

Ich habe das <%%Literal-Tag-Trennzeichen als Antwort darauf hinzugefügt , da es dunkel ist. Dies <%weist erb an, den Teil des Tags, der für js-Apps wie das Anzeigen von Tooltips für chart.js usw. erforderlich ist, nicht zu interpretieren .

Update (defekter Link behoben)

Alles über ERB finden Sie jetzt hier: https://puppet.com/docs/puppet/5.3/lang_template_erb.html#tags


1
Dieser Link beantwortet das OP genau
Ben Tinsley

Link ist jetzt unterbrochen
andreofthecape

Aktualisiert mit dem neuen Link!
bkunzi01

3

Diese werden in Rubin auf Schienen verwendet : -

<%%>: -

Die <%%> -Tags werden verwendet, um Ruby-Code auszuführen, der nichts zurückgibt, z. B. Bedingungen, Schleifen oder Blöcke. Z.B :-

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

<% =%>: -

Verwenden Sie diese Option, um den Inhalt anzuzeigen.

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

<% -%>: -

Rails erweitert ERB, sodass Sie die neue Zeile unterdrücken können, indem Sie Tags in Rails-Vorlagen einfach einen nachgestellten Bindestrich hinzufügen

<% #%>: -

Kommentieren Sie den Code aus

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

1

<% %>führt den Code dort aus, druckt aber das Ergebnis nicht aus, zum Beispiel:
Wir können ihn verwenden, wenn sonst in einer erb-Datei.

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

Wird gedruckt temp is 1


<%= %>führt den Code aus und druckt auch die Ausgabe, zum Beispiel:
Wir können den Wert einer Rails-Variablen drucken.

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

Wird gedruckt 1


<% -%>Es macht keinen Unterschied, da es nichts druckt, -%>nur Sinn macht <%= -%>, dies vermeidet eine neue Zeile.


<%# %> wird den darin geschriebenen Code auskommentieren.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.