Блокировать комментарии в шаблонах html.erb в рельсах


120

Как вы прокомментируете html, смешанный с кодом ruby?

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

В jsp все очень просто:, <%-- ... --%>но я не могу найти какой-либо лаконичный вариант в rails.

Простые html-комментарии <!-- ... -->не работают: код Ruby все еще выполняется и выдает ошибки.

Есть возможность использовать if falseс комментариями html, но она довольно многословна, не говоря уже о том, что IDE не поддерживают ее.

Также есть вариант из чистого рубина, который на удивление работает.

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

В целом это нормально, за исключением того, что он многословен, выглядит странно и ни одна из известных мне рубиновых IDE не поддерживает его (да, я люблю комментировать / закомментировать одним нажатием клавиши).

Мне любопытно, есть ли «официальные лица», делающие это в рельсах?

Спасибо!

Ответы:


115

Я бы не стал рассматривать как решение, но, возможно, заключив кусок между

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

или, если вы чувствуете себя немного грязным, создайте помощник, который просто ничего не выводит.

Мне это никогда не было нужно, но я споткнулся, похоже, для этого нет готового решения.


@Chloe Не совсем понимаю, почему вы направили свой комментарий мне, но вы совершенно правы, <%= false %>это не сработает. Вы должны попробовать предоставленное решение, которое будет работать <% if false %>без знака =
jamesc

@jamesc Ваш комментарий был удален до того, как вы увидели мой ответ. Кто-то удалил ваш комментарий там, где вы сказали использовать <%# if false %>.
Хлоя

163

Используйте это для комментирования отдельных строк:

<%# your_ruby_code %>

Для нескольких строк

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

То, что вы сказали, сработает.


2
Знаю, будет, интересно, есть ли что попроще :)
Никита Рыбак

2
= begin Я думаю, что begin - end будет all = end # Вы можете проигнорировать мой комментарий, так как он полностью прокомментирован: P
Гарфилд

3
он работает, если = находится в начале новой строки, как и в ответе
dhaval

а если это так <% =%>? Куда пойдет хеш - до или после знака равенства?
BKSpurgeon

К сожалению, попытался добавить комментарий с многострочным кодом. Вместо этого отправлю ответ.
ViggoV

30

=beginПодход раздражает , потому что:

  1. Это не работает для смешанного HTML и Ruby (или просто HTML), которые находятся в одной строке.
  2. Раздражает печатать

В <% if false %>подход работает, но это выглядит странно и не дает кому - либо еще , кто смотрит на свой код подсказку о своих намерениях.

Мое решение таково:

В application_helper.rbдобавьте метод так:

def comment
end

Затем в шаблоне представления вы можете сказать:

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

Это работает, потому что любой метод Ruby может принимать блок, но будет молча игнорировать переданный блок, если ваш метод не включает yield.


3
Вы даже можете написать это как <% comment do%> ... <% comment end%>. Я добавил этот синтаксис к возвышенному тексту, чтобы он даже выглядел как настоящий комментарий.
Мариано Кавалло

1
Прекрасное решение !! Одно улучшение: комментирование кода для его отключения - это своего рода взлом, поэтому лучше вызовите метод, ignoreили disableмы получим полностью семантическое решение:<% ignore do %>…<% end %>
tanius


7

Для блочных комментариев в шаблонах мой текстовый редактор (Komodo) находит этот вариант по рекомендации @Garfield наименее неприятным:

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

6

Чтобы закомментировать теги erb, используйте символ решетки комментария ruby ​​перед знаком = в открывающем теге.

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

Насколько я понимаю, он ищет решение для многострочного комментария: если у меня есть блок из n строк, я просто хочу иметь возможность добавить строку вверху и внизу (или, возможно, пару) и получить ее. работай. Я не хочу редактировать весь блок.
dionyziz

6

Поскольку вы можете использовать <% %>для размещения рубинового блока, его, безусловно, можно использовать для добавления в него комментариев.

Более простое и элегантное решение выглядело бы так ...

<%
# 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
Это не работает. Любые рубиновые теги внутри комментария блока закроют внешний блок.
Ховис Биддл,

4

После = begin вам не нужно ставить%>

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

Просто дополнение к некоторым из предыдущих ответов. Я нашел решение = begin / = end наиболее полезным, но для красоты я пишу его так:

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

Обратите внимание, что, поскольку все игнорируется до тех =endпор, пока нет необходимости закрывать =beginтег %>или открывать =endтег с помощью <%(что также было указано в более раннем ответе)

Я обнаружил, что это наиболее элегантное решение, позволяющее полностью исключить комментарий из блока смешанного кода ruby ​​и html и также выделить его серым цветом в моем редакторе, в отличие от <% if false %>решения. Единственный недостаток в том, что =beginи его =endнужно ставить в самом начале строки ..


1
Я получаю эту ошибку: «Встроенный документ встречается с концом файла»
Киран Эндрюс

2

Используйте комментарий с именем HEREDOC

Плюсы:

  • Понятно, что это комментарий
  • Работает с тегами erb и HTML
  • Имеет нормальную подсветку синтаксиса (как одна длинная строка)

Минусы:

  • Странный синтаксис закрытия 3 строк
  • Нет быстрых клавиш

Код:

Открывающий тег может быть

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

или

<%
<<-COMMENT
%>

Здесь ничего не запускается и не отображается в браузере

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

Закрывающий тег

да, это должно быть 3 строки 😟. Я не знаю, почему так важен открывающий тег erb, но это так! (если вы не использовали в комментарии какие-либо теги erb).

<%      
COMMENT
%>

1

Вы должны помнить, где выполняется код. Комментарии в стиле Ruby работают, потому что код Ruby выполняется на сервере до того, как он будет передан в веб-браузер. Это также объясняет, почему комментарии HTML не работают - Ruby уже был выполнен.

Разве IDE, которую вы используете, не поддерживает создание пользовательских макросов для комментирования блоков кода?


1) вы правы, jsp-комментарии имеют немного другой формат, я обновил пост. 2) Я не могу найти ничего подобного в IDEA или Netbeans. Вы имели в виду какую-то конкретную IDE, говоря это?
Никита Рыбак

1
Нет, не знал. Лично я не использую IDE для проектов Rails.
Джон Топли

1

Блок комментарии ярлык Sublime Text в ctrl+shift+/уведомление , есть ли у вас выбраны обычный HTML или тег Еврорадио пут либо <!---или , <% =begin %>соответственно.


Да, но это еще не закомментировать как HTML и рубин.
Adamantish

Хм ... звучит как хороший повод для кастомного плагина. Возможно, в качестве временной меры вы могли бы нажать, ctrl+dчтобы выбрать несколько раз начало каждого тега Erb <%в блоке, а затем нажать ctrl+shift+/, а затем нажать еще раз, чтобы весь блок закомментировал HTML.
iono

1

Вы можете использовать как <% if false%>, так и комментарии HTML одновременно:

<%if false%><--

stuff to comment out

--><%end%>

Преимущества:

  • Код Ruby не выполняется

  • Прокомментированный блок в IDE имеет серый цвет.

  • Намерение очевидно для других разработчиков


0

Это единственное, что у меня сработало.

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

Надеюсь, я просто поразил вас!


-4

Единственное приемлемое решение, которое я когда-либо нашел для этой непосильной проблемы, заключалось в том, чтобы поместить пробел в "<% =", чтобы он больше не регистрировался как рубиновый код, а затем закомментировал весь блок с помощью html-комментариев.

Как это:

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

Да, добавление пробелов раздражает. Но это наименее раздражающее из всех решений, которые я когда-либо видел.


1
Вы можете просто добавить #... вместо того, чтобы отправлять рубин в документ.
max
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.