Bloquear comentários nos modelos html.erb nos trilhos


119

Como você comenta o html misturado com o código ruby?

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

No jsp é bem simples:, <%-- ... --%>mas não consigo encontrar nenhuma opção concisa nos trilhos.

Comentários simples em html <!-- ... -->não funcionam: o código ruby ​​ainda é executado e grita erros.

Há uma opção para usar if falsecom comentários html, mas é bem detalhado, sem mencionar que os IDEs não suportam isso.

Há também uma opção vinda do rubi puro, que surpreendentemente funciona.

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

Geralmente é bom, exceto que é detalhado, de aparência estranha e nenhum dos IDEs em rubi que eu conheço (sim, eu gosto de comentar / comentar com um toque de tecla).

Estou curioso, existe algum 'oficial' de fazer isso nos trilhos?

Obrigado!

Respostas:


115

Eu não contaria como uma solução, mas talvez colocando o pedaço entre um

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

ou se você se sentir um pouco sujo, crie um ajudante que simplesmente não produza nada.

Eu nunca precisei disso, mas me deparei que parece não haver uma solução pronta para isso.


@ Chloe Não sei ao certo por que você direcionou seu comentário para mim, mas está certo de <%= false %>que não funcionaria. Você deve tentar a solução fornecida, que funcionaria <% if false %>sem o sinal =
jamesc 14/02

@jamesc Seu comentário foi excluído antes de você ver minha resposta. Alguém excluiu seu comentário onde você disse usar <%# if false %>.
Chloe

162

Use isso para comentar linhas simples:

<%# your_ruby_code %>

Para várias linhas, o

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

O que você disse funcionaria.


2
Eu sei que seria, eu estou interessado em saber se há alguma coisa mais simples :)
Nikita Rybak

2
= begin Eu acho que o começo - fim seria tudo = end # Você pode ignorar o meu comentário como totalmente comentado: P
Garfield

3
ele funciona if = é no início da nova linha apenas como na resposta
dhaval

e se for assim <% =%>? Para onde iria o hash - antes ou depois do sinal de igual?
BKSpurgeon

Ops, tentei adicionar um comentário com código de várias linhas. Em vez disso, postará uma resposta.
ViggoV

29

A =beginabordagem é irritante porque:

  1. Não funciona para HTML misto e Ruby (ou apenas HTML) em uma única linha
  2. É chato digitar

A <% if false %>abordagem funciona, mas parece estranha e não dá a ninguém que olha para o seu código uma dica sobre suas intenções.

Minha solução é a seguinte:

Em application_helper.rb, adicione um método para:

def comment
end

Em seguida, no seu modelo de visualização, você pode dizer:

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

Isso funciona porque qualquer método Ruby pode aceitar um bloco, mas ignorará silenciosamente o bloco passado se o seu método não incluir a yield.


3
Você pode até escrever como <% comment do%> ... <% comment end%>. Adicionei essa sintaxe ao texto sublime, para que pareça um comentário real.
Mariano Cavallo

1
Adorável solução !! Uma melhoria: comentando código para desativar é uma espécie de um truque, assim, em vez chamar o método ignoreou disablee nós temos uma solução totalmente semântica:<% ignore do %>…<% end %>
tanius


7

Para comentários em bloco nos modelos, meu editor de texto (Komodo) considera esta variação na recomendação de @ Garfield menos desagradável:

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

6

Para comentar as tags erb, use o símbolo de hash do comentário ruby ​​antes do sinal = na tag de abertura

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

Pelo que entendi, ele está procurando uma solução de comentário multilinha: se eu tiver um bloco de n linhas, só quero poder adicionar uma linha na parte superior e inferior (ou talvez algumas) e tê-la trabalhos. Eu não quero ter que editar o bloco inteiro.
dionyziz

6

Como você pode usar <% %>para colocar um bloco de rubi, ele certamente pode ser usado para colocar comentários nele.

Uma solução mais simples e elegante seria semelhante a ...

<%
# 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
Isso não funciona. Qualquer tag rubi dentro do comentário do bloco fechará o bloco externo.
Hovis Biddle

4

Depois de = begin, você não precisa colocar%>

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

Apenas um adendo para algumas das respostas anteriores. Eu achei a solução = begin / = end mais útil, mas por uma questão de beleza, eu a escrevo assim:

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

Note-se que uma vez que tudo é ignorado até que o =endnão há nenhuma necessidade de fechar a =begintag com %>ou abrir o =endtag com <%(que também tem sido apontado numa resposta anterior)

Eu achei que essa era a solução mais elegante para complementar completamente um bloco de código misto de ruby ​​e html e tê-lo acinzentado também no meu editor, em oposição à <% if false %>solução. A única desvantagem é essa =begine =enddeve ser colocada no início da linha.


1
Estou recebendo este erro: "documento incorporado atende ao final do arquivo"
Kieran Andrews

2

Use um comentário chamado HEREDOC

Prós:

  • Autoexplicativo de que este é um comentário
  • Funciona para tags erb e HTML
  • Possui destaque de sintaxe ok (como uma sequência longa)

Contras:

  • Sintaxe estranha de fechamento de 3 linhas
  • Sem atalhos de teclado

Código:

A tag de abertura pode 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

ou

<%
<<-COMMENT
%>

Qualquer coisa aqui não será exibida ou exibida no 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?

A tag de fechamento

sim, ele precisa ter 3 linhas 😟. Não sei por que a tag erb de abertura é importante, mas é! (a menos que você não tenha usado tags erb no comentário).

<%      
COMMENT
%>

1

Você deve ter em mente onde o código é executado. Comentários no estilo Ruby funcionam porque o código Ruby é executado no servidor antes de ser veiculado no navegador da web. Isso também explica por que os comentários HTML não funcionam - o Ruby já foi executado.

O IDE que você está usando não oferece suporte à criação de macros personalizadas para comentar blocos de código?


1) você está certo, os comentários do jsp têm um formato ligeiramente diferente, atualizei o post. 2) Não consigo encontrar nada parecido no IDEA ou no Netbeans. Você tinha alguma IDE em mente dizendo isso?
Nikita Rybak

1
Não, eu não fiz. Pessoalmente, não uso um IDE para projetos Rails.
precisa

1

O atalho de comentário em bloco do Sublime Text ctrl+shift+/percebe se você selecionou HTML normal ou uma tag Erb e coloca o <!---ou de <% =begin %>acordo.


Sim, mas isso ainda não comenta o HTML e o ruby.
Adamantish

Hmm ... parece uma boa causa para um plugin personalizado. Talvez como um paliativo, você pode pressionar ctrl+dpara selecionar várias vezes o início de cada tag Erb <%dentro do bloco e pressionar e ctrl+shift+/, em seguida, pressionar novamente para que todo o bloco comente o HTML.
iono 28/10

1

Você pode usar os comentários <% if false%> e HTML ao mesmo tempo:

<%if false%><--

stuff to comment out

--><%end%>

Os benefícios são:

  • Código Ruby não é executado

  • O bloco comentado tem cor cinza no IDE

  • A intenção é óbvia para outros desenvolvedores


0

Este é o único que funcionou para mim.

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

Espero ter acabado de explodir sua mente!


-4

A única solução aceitável que eu já encontrei para esse problema de última hora foi colocar um espaço dentro do "<% =" para deixar de ser registrado como código ruby ​​e, em seguida, comentar o bloco inteiro com comentários html

Como isso:

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

Sim, adicionar espaços é irritante. Mas é a menos chata de todas as soluções que eu já vi.


1
Você também pode adicionar um #... em vez de enviar ruby ​​no documento.
Max
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.