Blokuj komentarze w szablonach html.erb w railsach

120

Jak komentujesz html zmieszany z kodem ruby?

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

W jsp to naprawdę proste: <%-- ... --%>ale nie mogę znaleźć żadnej zwięzłej opcji w railsach.

Proste komentarze html <!-- ... -->nie działają: kod ruby ​​jest nadal wykonywany i generuje błędy.

Jest opcja do używania if falsez komentarzami HTML, ale jest dość rozwlekła, nie wspominając o tym, że IDE jej nie obsługują.

Jest też opcja pochodząca z czystego rubinu, która zaskakująco działa.

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

Generalnie jest w porządku, z wyjątkiem tego, że jest rozwlekły, dziwnie wyglądający i żadne z Ruby IDE, które znam, nie obsługuje go (tak, lubię komentować / komentować jednym naciśnięciem klawisza).

Ciekaw jestem, czy jest jakikolwiek „oficjalny” sposób robienia tego w railach?

Dzięki!

Nikita Rybak
źródło

Odpowiedzi:

115

Nie liczyłbym się jako rozwiązanie, ale być może zamknięcie kawałka między

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

lub jeśli poczujesz się trochę brudny, stwórz pomocnika, który po prostu nic nie wyświetla.

Nigdy tego nie potrzebowałem, ale potknąłem się, że nie ma na to gotowego rozwiązania.

Chubas
źródło
@Chloe Nie jestem pewien, dlaczego skierowałeś swój komentarz do mnie, ale masz całkowitą rację <%= false %>, nie zadziała. Powinieneś jednak wypróbować podane rozwiązanie, które działałoby <% if false %>bez znaku =
jamesc
@jamesc Twój komentarz został usunięty, zanim zobaczyłeś moją odpowiedź. Ktoś usunął Twój komentarz w miejscu, w którym powiedziałeś, że ma go używać <%# if false %>.
Chloe
162

Użyj tego do komentowania pojedynczych linii:

<%# your_ruby_code %>

W przypadku wielu wierszy

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

To, co powiedziałeś, zadziała.

Garfield
źródło
2
Wiem, że tak, interesuje mnie, czy jest coś prostszego :)
Nikita Rybak
2
= początek Myślę, że początek - koniec byłby wszystkim = koniec # Możesz zignorować mój komentarz, ponieważ jest on całkowicie skomentowany: P
Garfield
3
działa, jeśli = jest na początku nowej linii, tak jak w odpowiedzi
dhaval
co jeśli tak jest <% =%>? Gdzie poszedłby skrót - przed czy po znaku równości?
BKSpurgeon
Ups, próbowałem dodać komentarz z kodem wielowierszowym. Zamiast tego opublikuje odpowiedź.
ViggoV
29

To =beginpodejście jest denerwujące, ponieważ:

  1. Nie działa w przypadku mieszanego kodu HTML i Ruby (lub po prostu HTML) znajdującego się w jednej linii
  2. Pisanie jest denerwujące

To <% if false %>podejście działa, ale wygląda dziwnie i nie daje nikomu, kto spojrzy na Twój kod, podpowiedzi na temat Twoich zamiarów.

Moje rozwiązanie jest następujące:

W application_helper.rb, dodaj metodę, więc:

def comment
end

Następnie w szablonie widoku możesz powiedzieć:

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

To działa, ponieważ każda metoda Rubiego może przyjąć blok, ale dyskretnie zignoruje przekazany blok, jeśli twoja metoda nie zawiera yield.

sumizome
źródło
3
Możesz nawet zapisać to jako <% comment do%> ... <% comment end%>. Dodałem tę składnię do wysublimowanego tekstu, aby wyglądał nawet jak prawdziwy komentarz.
Mariano Cavallo
1
Cudowne rozwiązanie !! Jedno ulepszenie: komentowanie kodu, aby go wyłączyć, to rodzaj hackowania, więc raczej wywołaj metodę ignorelub disablei otrzymamy w pełni semantyczne rozwiązanie:<% ignore do %>…<% end %>
tanius
12
<%#=

...commented
multiline
block...

%>
Piotr Turek
źródło
1
Ta odpowiedź powinna wzbudzić większe zainteresowanie.
Ulysse BN
7

W przypadku komentarzy blokowych w szablonach mój edytor tekstu (Komodo) uważa tę odmianę rekomendacji @ Garfielda za najmniej nieprzyjemną:

<%# A long multiline comment in a rails template ...
  # line 2
  # and so on ... 
  # %>
klenwell
źródło
6

Aby skomentować tagi erb, użyj symbolu hash komentarza ruby ​​przed znakiem = w otwierającym tagu

<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
źródło
O ile rozumiem, szuka wielowierszowego rozwiązania do komentowania: jeśli mam blok n wierszy, chcę tylko móc dodać wiersz na górze i na dole (lub może kilka) i mieć to praca. Nie chcę edytować całego bloku.
dionyziz
6

Ponieważ możesz użyć <% %>do umieszczenia bloku ruby, z pewnością można go użyć do wstawienia do niego komentarzy.

Prostsze i eleganckie rozwiązanie wyglądałoby jak ...

<%
# 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
źródło
6
To nie działa. Wszelkie znaczniki ruby ​​wewnątrz komentarza do bloku zamkną zewnętrzny blok.
Hovis Biddle
4

Po = begin nie musisz umieszczać%>

<%
=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 %>
Michał
źródło
2

To tylko dodatek do niektórych poprzednich odpowiedzi. Wydaje mi się, że rozwiązanie = begin / = end jest najbardziej przydatne, ale ze względu na piękno piszę to tak:

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

Zwróć uwagę, że ponieważ wszystko jest ignorowane do momentu, w którym =endnie ma potrzeby zamykania =begintagu %>lub otwierania =endtagu za pomocą <%(co również zostało wskazane we wcześniejszej odpowiedzi)

Okazało się, że jest to najbardziej eleganckie rozwiązanie, aby całkowicie odkomentować blok mieszanego kodu ruby ​​i html, a także wyszarzać go w moim edytorze, w przeciwieństwie do <% if false %>rozwiązania. Jedyną wadą jest to, że =begini =endmusi być umieszczony na samym początku linii ..

ViggoV
źródło
1
Otrzymuję ten błąd: „osadzony dokument spełnia koniec pliku”
Kieran Andrews,
2

Użyj komentarza HEREDOC

Plusy:

  • Nie wymaga wyjaśnienia, że ​​jest to komentarz
  • Działa dla tagów erb i HTML
  • Ma prawidłowe podświetlanie składni (jako jeden długi ciąg)

Cons:

  • Dziwna składnia zamykająca 3 wiersze
  • Brak skrótów klawiaturowych

Kod:

Tag otwierający może być

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

lub

<%
<<-COMMENT
%>

Wszystko tutaj nie będzie działać ani wyświetlać się w przeglądarce

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

Tag zamykający

tak, muszą to być 3 linie 😟. Nie wiem, dlaczego otwierający tag erb jest ważny, ale tak jest! (chyba że w komentarzu nie użyto żadnych tagów erb).

<%      
COMMENT
%>
Arye Dov Eidelman
źródło
1

Musisz pamiętać, gdzie kod jest wykonywany. Komentarze w stylu Ruby działają, ponieważ kod Ruby jest wykonywany na serwerze, zanim zostanie przesłany do przeglądarki internetowej. To wyjaśnia również, dlaczego komentarze HTML nie działają - Ruby został już wykonany.

Czy IDE, którego używasz, nie obsługuje tworzenia niestandardowych makr do komentowania bloków kodu?

John Topley
źródło
1) masz rację, komentarze jsp mają nieco inny format, zaktualizowałem post. 2) Nie mogę znaleźć czegoś takiego w IDEA czy Netbeans. Czy miałeś coś konkretnego na myśli mówiąc to o IDE?
Nikita Rybak
1
Nie, nie zrobiłem. Osobiście nie używam IDE do projektów Railsowych.
John Topley,
1

Skrót do komentarza blokowego Sublime Text ctrl+shift+/informuje, czy wybrałeś normalny znacznik HTML lub Erb i wstawia odpowiednio <!---lub <% =begin %>.

iono
źródło
Tak, ale to nadal nie spowoduje komentowania zarówno kodu HTML, jak i ruby.
Adamantish
Hmm ... brzmi jak dobry powód do stworzenia niestandardowej wtyczki. Być może w ramach przerwania można nacisnąć, ctrl+daby zaznaczyć wiele początków każdego znacznika Erb <%w bloku, a następnie nacisnąć ctrl+shift+/, a następnie nacisnąć go jeszcze raz, aby cały blok zakomentował kod HTML.
iono
1

Możesz używać jednocześnie komentarzy <% if false%> i HTML:

<%if false%><--

stuff to comment out

--><%end%>

Korzyści to:

  • Kod Ruby nie jest wykonywany

  • Skomentowany blok ma szary kolor w IDE

  • Zamiar jest oczywisty dla innych programistów

wciąż czekam
źródło
0

To jedyny, który działał dla mnie.

<%
=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
źródło
0
<% %w(
  <span title="<%= title %>">hello</span>
) %>

Mam nadzieję, że właśnie rozwaliłem twój umysł!

DTrejo
źródło
-4

Jedynym akceptowalnym rozwiązaniem tego przełomowego problemu, jakie kiedykolwiek znalazłem, było umieszczenie spacji w „<% =”, aby nie był on już rejestrowany jako kod ruby, a następnie zakomentowanie całego bloku za pomocą komentarzy HTML

Lubię to:

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

Tak, dodawanie spacji jest denerwujące. Ale jest to najmniej irytujące ze wszystkich rozwiązań, jakie dotychczas widziałem.

Potrzebuję bohatera
źródło
1
Równie dobrze możesz po prostu dodać #... zamiast wysyłać ruby ​​w dokumencie.
maksymalnie