Bloquer les commentaires dans les modèles html.erb dans les rails


120

Comment commentez-vous html mélangé avec du code ruby?

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

Dans jsp, c'est vraiment simple:, <%-- ... --%>mais je ne trouve pas d'option concise dans les rails.

Les commentaires html simples <!-- ... -->ne fonctionnent pas: le code ruby ​​est toujours exécuté et crie des erreurs.

Il existe une option à utiliser if falseavec les commentaires html, mais elle est assez verbeuse, sans oublier que les IDE ne la prennent pas en charge.

Il existe également une option provenant de rubis pur, qui fonctionne étonnamment.

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

C'est généralement bien, sauf qu'il est verbeux, bizarre et qu'aucun des IDE ruby ​​que je connais ne le prend en charge (oui, j'aime commenter / commenter avec une seule touche).

Je suis curieux, y a-t-il un «officiel» de faire ça dans les rails?

Merci!

Réponses:


115

Je ne compterais pas comme une solution, mais peut-être enfermer le morceau entre

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

ou si vous vous sentez un peu sale, créez un assistant qui ne produit simplement rien.

Je n'en ai jamais eu besoin, mais je suis trébuché qu'il ne semble pas y avoir de solution prête à l'emploi pour cela.


@Chloe Je ne sais pas trop pourquoi tu m'as adressé ton commentaire mais tu as tout à fait raison <%= false %>ne fonctionnerait pas. Vous devriez essayer la solution fournie qui fonctionnerait <% if false %>sans le signe =
jamesc

@jamesc Votre commentaire a été supprimé avant que vous ne voyiez ma réponse. Quelqu'un a supprimé votre commentaire à l'endroit où vous aviez dit l'utiliser <%# if false %>.
Chloé le

162

Utilisez ceci pour commenter des lignes simples:

<%# your_ruby_code %>

Pour plusieurs lignes, le

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

Ce que vous avez dit fonctionnerait.


2
Je sais que ce serait le cas, je suis intéressé s'il y a quelque chose de plus simple :)
Nikita Rybak

2
= begin Je pense que le début - la fin serait tout = fin # Vous pouvez ignorer mon commentaire car il est entièrement commenté: P
Garfield

3
cela fonctionne si = est au début de la nouvelle ligne comme dans la réponse
dhaval

et si c'est comme ça <% =%>? Où irait le hachage - avant ou après le signe égal?
BKSpurgeon

Oups, j'ai essayé d'ajouter un commentaire avec du code multiligne. Publiera une réponse à la place.
ViggoV

29

L' =beginapproche est agaçante car:

  1. Cela ne fonctionne pas pour le HTML et Ruby mixtes (ou simplement HTML) sur une seule ligne
  2. C'est ennuyeux de taper

L' <% if false %>approche fonctionne, mais elle a l'air bizarre et ne donne à personne d'autre qui regarde votre code un indice sur vos intentions.

Ma solution est la suivante:

Dans application_helper.rb, ajoutez une méthode pour:

def comment
end

Ensuite, dans votre modèle de vue, vous pouvez dire:

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

Cela fonctionne car toute méthode Ruby peut prendre un bloc, mais ignorera silencieusement le bloc transmis si votre méthode n'inclut pas de fichier yield.


3
Vous pouvez même l'écrire comme <% comment do%> ... <% comment end%>. J'ai ajouté cette syntaxe à un texte sublime pour qu'il ressemble même à un vrai commentaire.
Mariano Cavallo

1
Belle solution !! Une amélioration: commenter du code pour le désactiver est une sorte de hack, alors appelez plutôt la méthode ignoreou disableet nous obtenons une solution entièrement sémantique:<% ignore do %>…<% end %>
tanius


7

Pour les commentaires de bloc dans les modèles, mon éditeur de texte (Komodo) trouve cette variante de la recommandation de @ Garfield la moins désagréable:

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

6

Pour commenter les balises erb, utilisez le symbole de hachage de commentaire ruby ​​avant le signe = dans la balise d'ouverture

<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>
-->

Autant que je sache, il recherche une solution de commentaire multiligne: si j'ai un bloc de n lignes, je veux juste pouvoir ajouter une ligne en haut et en bas (ou peut-être un couple) et l'avoir travail. Je ne veux pas avoir à éditer tout le bloc.
dionyziz

6

Puisque vous pouvez utiliser <% %>pour mettre un bloc ruby, il peut certainement être utilisé pour y mettre des commentaires.

Une solution plus simple et élégante ressemblerait à ...

<%
# 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
Cela ne marche pas. Toutes les balises ruby ​​à l'intérieur du commentaire de bloc fermeront le bloc externe.
Hovis Biddle

4

Après = commencer, vous n'avez pas besoin de mettre%>

<%
=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

Juste un addendum à certaines des réponses précédentes. J'ai trouvé la solution = begin / = end la plus utile, mais par souci de beauté, je l'écris comme ceci:

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

Notez que puisque tout est ignoré jusqu'à ce =endqu'il n'y ait pas besoin de fermer la =beginbalise avec %>ou d'ouvrir la =endbalise avec <%(ce qui a également été souligné dans une réponse précédente)

J'ai trouvé que c'était la solution la plus élégante pour complètement surpasser un bloc de code mixte rubis et html et le faire griser également dans mon éditeur, par opposition à la <% if false %>solution. Le seul inconvénient est que =beginet =enddoit être placé au tout début de la ligne.


1
Je reçois cette erreur: "le document intégré rencontre la fin du fichier"
Kieran Andrews

2

Utiliser un commentaire appelé HEREDOC

Avantages:

  • Explicite qu'il s'agit d'un commentaire
  • Fonctionne pour les balises erb et HTML
  • A la coloration syntaxique correcte (comme une longue chaîne)

Les inconvénients:

  • Syntaxe de fermeture étrange de 3 lignes
  • Pas de raccourcis clavier

Code:

La balise d'ouverture peut être

<% <<-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

ou

<%
<<-COMMENT
%>

Tout ce qui se trouve ici ne fonctionnera pas ou n'apparaîtra pas dans le navigateur

<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?

La balise de fermeture

oui, il faut 3 lignes 😟. Je ne sais pas pourquoi la balise erb d'ouverture est importante mais c'est le cas! (sauf si vous n'avez pas utilisé de balises erb dans le commentaire).

<%      
COMMENT
%>

1

Vous devez garder à l'esprit où le code est exécuté. Les commentaires de style Ruby fonctionnent car le code Ruby est exécuté sur le serveur avant d'être diffusé sur le navigateur Web. Cela explique également pourquoi les commentaires HTML ne fonctionnent pas - le Ruby a déjà été exécuté.

L'IDE que vous utilisez ne prend-il pas en charge la création de macros personnalisées pour commenter des blocs de code?


1) vous avez raison, les commentaires jsp ont un format légèrement différent, j'ai mis à jour le message. 2) Je ne trouve rien de tel dans IDEA ou Netbeans. Aviez-vous quelque chose d'IDE particulier en tête en disant cela?
Nikita Rybak

1
Non, je ne l'ai pas fait. Personnellement, je n'utilise pas d'IDE pour les projets Rails.
John Topley

1

Le raccourci de commentaire de bloc de Sublime Text ctrl+shift+/remarque si vous avez sélectionné du HTML normal ou une balise Erb et place le <!---ou en <% =begin %>conséquence.


Oui, mais cela ne commentera toujours pas le HTML et le ruby.
Adamantish

Hmm ... sonne comme une bonne cause pour un plugin personnalisé. Peut-être que pour remédier à la situation, vous pouvez appuyer sur ctrl+dpour sélectionner le début de chaque balise Erb <%dans le bloc, puis appuyer sur, puis appuyer à ctrl+shift+/nouveau pour tout le bloc pour commenter le HTML.
iono

1

Vous pouvez utiliser à la fois <% if false%> et les commentaires HTML en même temps:

<%if false%><--

stuff to comment out

--><%end%>

Les avantages sont:

  • Le code Ruby n'est pas exécuté

  • Le bloc commenté est de couleur grise dans l'IDE

  • L'intention est évidente pour les autres développeurs


0

C'est le seul qui a fonctionné pour moi.

<%
=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>
) %>

J'espère que je viens de vous épater!


-4

La seule solution acceptable que j'ai jamais trouvée à ce problème épuisant était de mettre un espace dans le "<% =" pour qu'il ne soit plus enregistré en tant que code ruby, puis de commenter le bloc entier avec des commentaires html

Comme ça:

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

Oui, ajouter des espaces est ennuyeux. Mais c'est la moins ennuyeuse de toutes les solutions que j'ai encore vues.


1
Vous pourriez aussi bien ajouter un #... au lieu d'envoyer ruby ​​dans le document.
max
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.