413 Stimmen

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

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

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

Was ist die Verwendung der einzelnen Elemente?

538voto

auralbee Punkte 8521
<% %>

Führt den Ruby-Code innerhalb der Klammern aus.

<%= %>

Druckt etwas in eine erb-Datei.

<%== %>

Äquivalent zu <%= raw %> . Druckt etwas wortwörtlich (d.h. ohne Escaping) in eine erb-Datei. (Entnommen aus Ruby on Rails-Anleitungen .)

<% -%>

Vermeidet den Zeilenumbruch nach dem Ausdruck.

<%# %>

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

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

94voto

yalestar Punkte 9084

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

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

<%# %> ist ein ERB-Kommentar

Hier ist ein guter Leitfaden: http://api.rubyonrails.org/classes/ActionView/Base.html

70voto

Rails tut pas verwenden Sie die stdlibs ERB verwendet er standardmäßig erubis . Quellen: der Kommentar dieses Entwicklers , ActionViews gemspec , akzeptierte Zusammenführungsanforderung, die ich beim Schreiben dieses Artikels .

Dort sind Verhaltensunterschiede zwischen ihnen, insbesondere hinsichtlich der Art und Weise, wie die Bindestrichoperatoren %- y -% Arbeit.

Die Dokumentation ist spärlich, Wo ist das ERB-Format von Ruby "offiziell" definiert? Was folgt, sind also empirische Schlussfolgerungen.

Alle Tests gehen davon aus:

require 'erb'
require 'erubis'

Wann Sie Folgendes verwenden können -

  • ERB: Sie müssen bestehen - a trim_mode Option von ERB.new es zu benutzen.
  • 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 -% tut:

  • ERB: Das nächste Zeichen wird entfernt, wenn es ein Zeilenumbruch ist.

  • erubis:

    • in <% %> (ohne = ), - ist nutzlos, weil <% %> y <% -%> sind identisch. <% %> entfernt die aktuelle Zeile, wenn sie nur Leerzeichen enthält, und tut sonst nichts.

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

      • die gesamte Zeile entfernen, wenn sie nur Leerzeichen enthält
      • sonst, wenn vor dem Tag ein Nicht-Leerzeichen steht und nur Leerzeichen dahinter, werden die Leerzeichen danach entfernt
      • sonst steht ein Nicht-Leerzeichen nach dem Tag: 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 %- tut:

  • ERB: entfernt Leerzeichen vor dem Tag und nach vorherigen Zeilenumbrüchen, aber nur, wenn vorher nur Leerzeichen vorhanden sind.

  • erubis: nutzlos, weil <%- %> ist dasselbe wie <% %> (ohne = ), und dies kann nicht mit = was der einzige Fall ist, in dem -% nützlich sein kann. Verwenden Sie dies also 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 %- y -% gemeinsam tun

Die exakte Kombination beider Effekte getrennt.

11voto

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

8voto

bkunzi01 Punkte 4405

Ich habe die <%% literales Tag-Begrenzungszeichen als Antwort auf dieses Problem, weil es zu unklar ist. Dadurch wird erb angewiesen, das <% Teil des Tags, der für js-Anwendungen wie die Anzeige von chart.js-Tooltips usw. erforderlich ist.

Update (Fehlerhafter Link korrigiert)

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X