Bloquear comentarios en plantillas html.erb en rieles

120

¿Cómo comentas html mezclado con código ruby?

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

En jsp es muy simple:, <%-- ... --%>pero no puedo encontrar ninguna opción concisa en rieles.

Los comentarios html simples <!-- ... -->no funcionan: el código ruby ​​todavía se ejecuta y grita errores.

Hay una opción para usar if falsecon comentarios html, pero es bastante detallada, sin mencionar que los IDE no la admiten.

También hay una opción proveniente de rubí puro, que sorprendentemente funciona.

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

En general, está bien, excepto que es detallado, de aspecto extraño y ninguno de los IDE ruby ​​que conozco lo admite (sí, me gusta comentar / comentar con una pulsación de tecla).

Tengo curiosidad, ¿hay algún 'oficial' de hacer esto en rieles?

¡Gracias!

Nikita Rybak
fuente

Respuestas:

115

No contaría como una solución, pero tal vez encerrar el trozo entre un

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

o si se siente un poco sucio, cree un ayudante que simplemente no produzca nada.

Nunca lo he necesitado, pero me parece que no hay una solución lista para usar para esto.

Chubas
fuente
@Chloe No estoy muy seguro de por qué me dirigió su comentario, pero tiene razón <%= false %>, no funcionaría. Sin embargo, debe probar la solución provista que funcionaría <% if false %>sin el signo =
jamesc
@jamesc Tu comentario fue eliminado antes de que vieras mi respuesta. Alguien borró tu comentario donde dijiste usar <%# if false %>.
Chloe
162

Use esto para comentar líneas individuales:

<%# your_ruby_code %>

Para varias líneas, el

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

Lo que dijiste funcionaría.

Garfield
fuente
2
Sé que lo haría, me interesa si hay algo más simple :)
Nikita Rybak
2
= comenzar Creo que el comienzo - el final sería todo = final # Puede ignorar mi comentario ya que está completamente comentado: P
Garfield
3
funciona si = está al comienzo de una nueva línea como en la respuesta
dhaval
¿y si es así <% =%>? ¿Dónde iría el hash, antes o después del signo igual?
BKSpurgeon
Vaya, intenté agregar un comentario con código de varias líneas. En su lugar, publicará una respuesta.
ViggoV
29

El =beginenfoque es molesto porque:

  1. No funciona para HTML y Ruby (o simplemente HTML) que están en una sola línea
  2. Es molesto escribir

El <% if false %>enfoque funciona, pero parece extraño y no le da a nadie más que mire su código una pista sobre sus intenciones.

Mi solución es la siguiente:

En application_helper.rb, agregue un método para:

def comment
end

Luego, en su plantilla de vista, puede decir:

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

Esto funciona porque cualquier método Ruby puede tomar un bloque, pero ignorará silenciosamente el bloque pasado si su método no incluye un yield.

Sumizome
fuente
3
Incluso puede escribirlo como <% comment do%> ... <% comment end%>. He agregado esta sintaxis al texto sublime para que incluso parezca un comentario real.
Mariano Cavallo
1
Hermosa solución !! Una de las mejoras: comentando código para desactivarlo es una especie de corte, así que en lugar llamamos el método ignoreo disabley obtenemos una solución completamente semántica:<% ignore do %>…<% end %>
Tanius
12
<%#=

...commented
multiline
block...

%>
Piotr Turek
fuente
1
Esta respuesta debería tener mucho más interés.
Ulysse BN
7

Para bloquear comentarios en plantillas, mi editor de texto (Komodo) encuentra esta variación en la recomendación de @ Garfield menos desagradable:

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

Para comentar las etiquetas erb, use el símbolo de hash de comentario ruby ​​antes del signo = en la etiqueta de apertura

<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>
-->
jamesw
fuente
Por lo que tengo entendido, está buscando una solución de comentarios de varias líneas: si tengo un bloque de n líneas, solo quiero poder agregar una línea en la parte superior e inferior (o tal vez un par) y tenerla trabajo. No quiero tener que editar todo el bloque.
dionyziz
6

Ya que puedes usar <% %> para poner un bloque ruby, ciertamente se puede usar para agregar comentarios.

Una solución más simple y elegante se vería como ...

<%
# 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?
%>
Sagar Ranglani
fuente
6
Esto no funciona. Cualquier etiqueta ruby ​​dentro del comentario del bloque cerrará el bloque exterior.
Hovis Biddle
4

Después de = comenzar no es necesario poner%>

<%
=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 %>
Michal
fuente
2

Solo un apéndice a algunas de las respuestas anteriores. Encontré la solución = begin / = end más útil, pero por el bien de la belleza, la escribo así:

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

Tenga en cuenta que, dado que todo se ignora hasta que =endno hay necesidad de cerrar la =beginetiqueta %>o abrir la =endetiqueta con<% (lo que también se señaló en una respuesta anterior)

Encontré que esta es la solución más elegante para excluir por completo un bloque de código ruby ​​y html mezclado y tenerlo en gris también en mi editor, a diferencia de la <% if false %>solución. El único inconveniente es que =beginy =enddebe ser colocado en el mismo comienzo de la línea ..

ViggoV
fuente
1
Recibo este error: "el documento incrustado coincide con el final del archivo"
Kieran Andrews
2

Utilice un comentario llamado HEREDOC

Pros:

  • Se explica por sí mismo que este es un comentario.
  • Funciona para etiquetas erb y HTML
  • Tiene resaltado de sintaxis aceptable (como una cadena larga)

Contras:

  • Extraña sintaxis de cierre de 3 líneas
  • Sin atajos de teclado

Código:

La etiqueta de apertura puede ser

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

o

<%
<<-COMMENT
%>

Cualquier cosa aquí no se ejecutará ni se mostrará en el navegador.

<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 etiqueta de cierre

sí, debe ser de 3 líneas 😟. No sé por qué la etiqueta erb de apertura es importante, ¡pero lo es! (a menos que no haya utilizado ninguna etiqueta erb en el comentario).

<%      
COMMENT
%>
Arye Dov Eidelman
fuente
1

Hay que tener en cuenta dónde se ejecuta el código. Los comentarios de estilo Ruby funcionan porque el código Ruby se ejecuta en el servidor antes de que se sirva al navegador web. Esto también explica por qué los comentarios HTML no funcionan: Ruby ya se ha ejecutado.

¿El IDE que está utilizando no admite la creación de macros personalizadas para comentar bloques de código?

John Topley
fuente
1) tienes razón, los comentarios jsp tienen un formato ligeramente diferente, actualicé la publicación. 2) No puedo encontrar nada parecido en IDEA o Netbeans. ¿Tenías algún IDE en particular en mente al decir esto?
Nikita Rybak
1
No, no lo hice. Personalmente, no uso un IDE para proyectos de Rails.
John Topley
1

El atajo de comentario de bloque de Sublime Text ctrl+shift+/advierte si ha seleccionado HTML normal o una etiqueta Erb y coloca el <!---o en <% =begin %>consecuencia.

iono
fuente
Sí, pero esto todavía no comentará tanto el HTML como el ruby.
Adamantish
Hmm ... suena como una buena causa para un complemento personalizado. Tal vez, como medida provisional, puede presionar ctrl+dpara realizar una selección múltiple del inicio de cada etiqueta Erb <%dentro del bloque y luego presionar ctrl+shift+/, luego presionarlo una vez más para que todo el bloque comente el HTML.
iono
1

Puede utilizar <% if false%> y comentarios HTML al mismo tiempo:

<%if false%><--

stuff to comment out

--><%end%>

Los beneficios son:

  • El código Ruby no se ejecuta

  • El bloque comentado tiene color gris en IDE

  • La intención es obvia para otros desarrolladores.

todavía esperando
fuente
0

Este es el único que funcionó para mí.

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

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

¡Espero haberlos asombrado!

DTrejo
fuente
-4

La única solución aceptable que encontré para este problema fue poner un espacio dentro de "<% =" para que ya no se registre como código ruby, y luego comentar todo el bloque con comentarios html.

Me gusta esto:

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

Sí, agregar los espacios es molesto. Pero es la menos molesta de todas las soluciones que he visto hasta ahora.

Necesito un héroe
fuente
1
También puede agregar un #... en lugar de enviar ruby ​​en el documento.
máximo