Blockieren Sie Kommentare in html.erb-Vorlagen in Schienen


119

Wie kommentiert man HTML gemischt mit Ruby-Code aus?

some text <% ... %> more text <%= ... %>
something else
<% ... %>

In jsp ist es ganz einfach: <%-- ... --%> , aber ich kann keine prägnante Option in Schienen finden.

Einfache HTML-Kommentare <!-- ... --> funktionieren nicht: Ruby-Code wird weiterhin ausgeführt und schreit nach Fehlern.

Es gibt eine Option zu verwenden if false mit HTML-Kommentaren verwendet werden kann, aber sie ist ziemlich ausführlich, ganz zu schweigen davon, dass IDEs sie nicht unterstützen.

Es gibt auch eine Option aus reinem Rubin, die überraschenderweise funktioniert.

<%
=begin %>
... html and ruby code goes here
<%
=end %>

Es ist im Allgemeinen in Ordnung, außer dass es wortreich, seltsam aussehend ist und keine der mir bekannten Ruby-IDEs es unterstützt (ja, ich kommentiere / kommentiere gerne mit einem Tastendruck aus).

Ich bin neugierig, gibt es einen "Beamten", der dies in Schienen tut?

Vielen Dank!

Antworten:


115

Ich würde nicht als Lösung gelten, aber vielleicht den Teil zwischen einem einschließen

<% if false %>
   ...
<% end %>

oder wenn Sie sich etwas schmutzig fühlen, erstellen Sie einen Helfer, der einfach nichts ausgibt.

Ich habe es nie gebraucht, aber ich bin gestolpert, dass es dafür keine sofort einsatzbereite Lösung zu geben scheint.


@Chloe Nicht ganz sicher, warum Sie Ihren Kommentar an mich gerichtet haben, aber Sie sind ganz richtig, <%= false %>würde nicht funktionieren. Sie sollten jedoch die bereitgestellte Lösung ausprobieren, die <% if false %>ohne das = sign
jamesc

@jamesc Dein Kommentar wurde gelöscht, bevor du meine Antwort gesehen hast. Jemand hat Ihren Kommentar dort gelöscht, wo Sie ihn verwenden möchten <%# if false %>.
Chloe

162

Verwenden Sie dies zum Kommentieren einzelner Zeilen:

<%# your_ruby_code %>

Für mehrere Zeilen wird die

<% 
=begin %>  <% ruby_code %>
<% 
=end %>

Was du gesagt hast, würde funktionieren.


2
Ich weiß es würde, ich bin interessiert, ob es etwas Einfacheres gibt :)
Nikita Rybak

2
= Anfang Ich denke, der Anfang - Ende wäre alles = Ende # Sie können meinen Kommentar ignorieren, da er vollständig kommentiert ist: P
Garfield

3
es funktioniert, wenn = am Anfang einer neuen Zeile steht, genau wie in der Antwort
dhaval

Was ist, wenn es so ist <% =%>? Wohin würde der Hash gehen - vor oder nach dem Gleichheitszeichen?
BKSpurgeon

Hoppla, ich habe versucht, einen Kommentar mit mehrzeiligem Code hinzuzufügen. Wird stattdessen eine Antwort posten.
ViggoV

29

Der =beginAnsatz ist ärgerlich, weil:

  1. Es funktioniert nicht für gemischtes HTML und Ruby (oder nur HTML) in einer einzelnen Zeile
  2. Es ist nervig zu tippen

Der <% if false %>Ansatz funktioniert, sieht aber seltsam aus und gibt niemandem, der sich Ihren Code ansieht, einen Hinweis auf Ihre Absichten.

Meine Lösung lautet wie folgt:

In application_helper.rb, fügen Sie eine Methode so:

def comment
end

Dann können Sie in Ihrer Ansichtsvorlage sagen:

<% comment do %>Some stuff that won't be rendered...<% end %>

Dies funktioniert, weil jede Ruby-Methode einen Block aufnehmen kann, den übergebenen Block jedoch stillschweigend ignoriert, wenn Ihre Methode kein enthält yield.


3
Sie können es sogar als <% comment do%> ... <% comment end%> schreiben. Ich habe diese Syntax zu erhabenem Text hinzugefügt, damit sie sogar wie ein echter Kommentar aussieht.
Mariano Cavallo

1
Schöne Lösung !! Eine Verbesserung: Code zu deaktivieren kommentiert es ist irgendwie ein Hack, also eher ruft die Methode ignoreoder disableund wir eine voll semantische Lösung erhalten:<% ignore do %>…<% end %>
tanius


7

Für Block Kommentare in Vorlagen, mein Texteditor (Komodo) findet diese Variante @ Garfield Empfehlung dest widerwärtig:

<%# A long multiline comment in a rails template ...
  # line 2
  # and so on ... 
  # %>

6

Um erb-Tags zu kommentieren, verwenden Sie das Ruby-Kommentar-Hash-Symbol vor dem = -Zeichen im Eröffnungs-Tag

<p>
 This is some text I want to keep
 <%= @some_object.some_attribute %>
</p>
<p>
  I want to keep this text but comment out the erb tag
  <%#= @some_object.another_attribute %>
</p>
<!--
<p>
  I want all of this text commented out including the erb tag
  <%#= @some_object.some_attribute %>
</p>
-->
<!--
<p>
 I just want this html commented out but I want to keep the erb tag
 <%= @some_object.some_attribute %>
</p>
-->

Soweit ich weiß, sucht er nach einer mehrzeiligen Lösung zum Auskommentieren: Wenn ich einen Block mit n Zeilen habe, möchte ich nur eine Zeile oben und unten (oder vielleicht ein paar) hinzufügen und haben können Arbeit. Ich möchte nicht den ganzen Block bearbeiten müssen.
Dionyziz

6

Da kannst du verwenden <% %> einen Ruby-Block einfügen können, können Sie damit durchaus Kommentare einfügen.

Eine einfachere und elegantere Lösung würde aussehen wie ...

<%
# See! I am a Ruby Comment
# And I am multi-line
# I look like a recognizable ruby comment block too
# and not so complex
# The only drawback with me is the Hash symbol you have to repeat
# But it's the norm, isn't it?
%>

6
Das funktioniert nicht. Alle Ruby-Tags im Blockkommentar schließen den äußeren Block.
Hovis Biddle

4

Nach = begin müssen Sie nicht%> setzen

<%
=begin

code code code code code code 
code code code code code code 
code code code code code code 
code code code code code code 

=end %>

2

Nur ein Nachtrag zu einigen der vorherigen Antworten. Ich fand die Lösung = begin / = end am nützlichsten, aber der Schönheit halber schreibe ich sie so:

<%
=begin
  <p>HTML will be ignored</p>
  <%= 'and so will ruby' %>
  <p>
    <%= 'plus the whole block will be greyed in editor' %>
  </p>
=end
%>

Beachten Sie, dass da alles , bis das ignoriert wird =endes keine Notwendigkeit, das schließen =beginTag mit %>oder öffnen Sie den =endTag mit<% (die auch in einer früheren Antwort darauf wurde aus)

Ich fand, dass dies die eleganteste Lösung ist, um einen Block gemischten Rubin- und HTML-Codes vollständig zu übertreffen und ihn im Gegensatz zur <% if false %>Lösung auch in meinem Editor ausgegraut zu haben . Einziger Nachteil ist das =beginund =endmuss ganz am Anfang der Zeile stehen.


1
Ich erhalte die Fehlermeldung: "Eingebettetes Dokument trifft Dateiende"
Kieran Andrews

2

Verwenden Sie einen HEREDOC namens Kommentar

Vorteile:

  • Selbsterklärend, dass dies ein Kommentar ist
  • Funktioniert für erb- und HTML-Tags
  • Hat eine gute Syntaxhervorhebung (als eine lange Zeichenfolge)

Nachteile:

  • Seltsame 3-Zeilen-Schlusssyntax
  • Keine Tastaturkürzel

Code:

Das Eröffnungs-Tag kann sein

<% <<-COMMENT %>

the above closing erb tag is just for looks (to match the end),
but don't put anything else there, it may show up on the page

oder

<%
<<-COMMENT
%>

Alles hier wird nicht ausgeführt oder im Browser angezeigt

<P>
    this will not be displayed in the browser
    <strong> even in the developer's tools </strong>
</p>

<% 1_000_000_000_000.times do |count| %>

for the <%= count %>'th time, this won't run a trillion times,
this is all just a string

all of these %>, <%, <% end %>, end, do, <!--, won't cause any issues.

but the below opening erb tag is important (if you used any erb tags in the comment).
I have no clue why?

Das schließende Tag

ja es müssen 3 Zeilen sein 😟. Ich weiß nicht, warum das öffnende erb-Tag wichtig ist, aber es ist! (es sei denn, Sie haben im Kommentar keine erb-Tags verwendet).

<%      
COMMENT
%>

1

Sie müssen berücksichtigen, wo der Code ausgeführt wird. Kommentare im Ruby-Stil funktionieren, da der Ruby-Code auf dem Server ausgeführt wird, bevor er dem Webbrowser bereitgestellt wird. Dies erklärt auch, warum HTML-Kommentare nicht funktionieren - der Ruby wurde bereits ausgeführt.

Unterstützt die von Ihnen verwendete IDE nicht das Erstellen benutzerdefinierter Makros zum Auskommentieren von Codeblöcken?


1) Sie haben Recht, JSP-Kommentare haben ein etwas anderes Format. Ich habe den Beitrag aktualisiert. 2) Ich kann so etwas in IDEA oder Netbeans nicht finden. Hatten Sie eine bestimmte IDE im Sinn, die dies sagte?
Nikita Rybak

1
Nein, habe ich nicht. Persönlich verwende ich keine IDE für Rails-Projekte.
John Topley

1

Die Blockkommentar-Verknüpfung von Sublime Text erkennt ctrl+shift+/, ob Sie normales HTML oder ein Erb-Tag ausgewählt haben, und fügt entweder das <!---oder das <% =begin %>entsprechende ein.


Ja, aber dies wird immer noch nicht sowohl den HTML-Code als auch den Ruby auskommentieren.
Adamantish

Hmm ... klingt nach einem guten Grund für ein benutzerdefiniertes Plugin. Vielleicht könnten Sie als Notlösung drücken ctrl+d, um den Anfang jedes Erb-Tags <%innerhalb des Blocks mehrfach auszuwählen , und dann drücken und dann noch einmal drücken , ctrl+shift+/damit der gesamte Block den HTML- Code auskommentiert .
Iono

1

Sie können sowohl <% if false%> als auch HTML-Kommentare gleichzeitig verwenden:

<%if false%><--

stuff to comment out

--><%end%>

Die Vorteile sind:

  • Ruby-Code wird nicht ausgeführt

  • Der kommentierte Block hat in der IDE eine graue Farbe

  • Die Absicht ist für andere Entwickler offensichtlich


0

Dies ist der einzige, der für mich gearbeitet hat.

<%
=begin %>

code code code code code code 
code code code code code code 
code code code code code code 
code code code code code code 

=end %>


0
<% %w(
  <span title="<%= title %>">hello</span>
) %>

Ich hoffe, ich habe dich gerade umgehauen!


-4

Die einzig akzeptable Lösung, die ich jemals für dieses Problem gefunden habe, bestand darin, ein Leerzeichen in "<% =" einzufügen, damit es nicht mehr als Ruby-Code registriert wird, und dann den gesamten Block mit HTML-Kommentaren auskommentieren

So was:

<!--
<p>
  < %= @some_object.some_attribute %>
</p>
<p>
  < %= @some_object.another_attribute %>
</p>
<p>
  < %= @some_object.some_attribute %>
</p>
<p>
  < %= @some_object.some_attribute %>
</p>
-->

Ja, das Hinzufügen der Leerzeichen ist ärgerlich. Aber es ist die am wenigsten ärgerliche aller Lösungen, die ich bisher gesehen habe.


1
Sie können auch einfach ein #... hinzufügen, anstatt Ruby in das Dokument zu senden.
Max
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.