Chặn nhận xét trong các mẫu html.erb trong đường ray


120

Làm thế nào để bạn nhận xét ra html trộn với mã ruby?

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

Trong jsp nó thực sự đơn giản:, <%-- ... --%>nhưng tôi không thể tìm thấy bất kỳ tùy chọn ngắn gọn nào trong đường ray.

Các nhận xét html đơn giản <!-- ... -->không hoạt động: mã ruby ​​vẫn được thực thi và báo lỗi.

Có một tùy chọn để sử dụng if falsevới các bình luận html, nhưng nó khá dài dòng, chưa kể IDE không hỗ trợ nó.

Ngoài ra còn có một tùy chọn đến từ ruby ​​nguyên chất, hoạt động đáng ngạc nhiên.

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

Nói chung là ổn, ngoại trừ nó dài dòng, trông kỳ lạ và không có IDE ruby ​​nào mà tôi biết hỗ trợ nó (vâng, tôi thích bình luận / bình luận bằng một lần nhấn phím).

Tôi tò mò, có 'chính thức' nào làm điều này trong đường ray không?

Cảm ơn!

Câu trả lời:


115

Tôi sẽ không tính là một giải pháp, nhưng có lẽ bao quanh một đoạn giữa một

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

hoặc nếu bạn cảm thấy hơi bẩn, hãy tạo một trình trợ giúp đơn giản là không có kết quả nào.

Tôi chưa bao giờ cần đến nó, nhưng dường như không có giải pháp nào phù hợp cho việc này.


@Chloe Không hoàn toàn chắc chắn tại sao bạn chuyển hướng nhận xét của bạn cho tôi nhưng bạn khá chính xác <%= false %>sẽ không hoạt động. Bạn nên thử giải pháp được cung cấp mặc dù sẽ hoạt động <% if false %>mà không có dấu =
jamesc

@jamesc Bình luận của bạn đã bị xóa trước khi bạn thấy phản hồi của tôi. Ai đó đã xóa bình luận của bạn nơi bạn nói là sử dụng <%# if false %>.
Chloe

162

Sử dụng cái này để bình luận những dòng đơn:

<%# your_ruby_code %>

Đối với nhiều dòng,

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

Những gì bạn nói sẽ hiệu quả.


2
Tôi biết nó sẽ, tôi đang quan tâm nếu có bất cứ điều gì đơn giản hơn :)
Nikita Rybak

2
= bắt đầu tôi nghĩ là bắt đầu - cuối sẽ là tất cả = cuối # Bạn có thể bỏ qua nhận xét của tôi như nó hoàn toàn nhận xét: P
Garfield

3
nó hoạt động nếu = ở đầu dòng mới giống như trong câu trả lời
dhaval

điều gì sẽ xảy ra nếu nó giống như thế này <% =%>? Hàm băm sẽ đi đâu - trước hoặc sau dấu bằng?
BKSpurgeon

Rất tiếc, đã cố thêm nhận xét bằng mã nhiều dòng. Sẽ đăng một câu trả lời thay thế.
ViggoV

29

Cách =begintiếp cận này gây khó chịu vì:

  1. Nó không hoạt động với HTML hỗn hợp và Ruby (hoặc chỉ HTML) nằm trên một dòng
  2. Thật khó chịu khi gõ

Cách <% if false %>tiếp cận này hoạt động, nhưng nó trông kỳ lạ và không cung cấp cho bất kỳ ai khác nhìn vào mã của bạn một gợi ý về ý định của bạn.

Giải pháp của tôi như sau:

Trong application_helper.rb, thêm một phương thức để:

def comment
end

Sau đó, trong mẫu chế độ xem của bạn, bạn có thể nói:

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

Điều này hoạt động vì bất kỳ phương thức Ruby nào cũng có thể nhận một khối, nhưng sẽ im lặng bỏ qua khối được truyền vào nếu phương thức của bạn không bao gồm một yield.


3
Bạn thậm chí có thể viết nó dưới dạng <% comment do%> ... <% comment end%>. Tôi đã thêm cú pháp này vào văn bản siêu phàm để nó thậm chí trông giống như một bình luận thực sự.
Mariano Cavallo,

1
Giải pháp đáng yêu !! Một cải tiến: cho ý kiến mã để vô hiệu hóa nó là loại một hack, vì vậy thay vì gọi phương thức ignorehay disablevà chúng tôi có được một giải pháp đầy đủ ngữ nghĩa:<% ignore do %>…<% end %>
tanius


7

Đối với các nhận xét khối trong các mẫu, trình soạn thảo văn bản của tôi (Komodo) nhận thấy biến thể này trong đề xuất của @ Garfield là ít đáng ghét nhất:

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

6

Để nhận xét các thẻ erb, hãy sử dụng biểu tượng băm nhận xét ruby ​​trước dấu = trong thẻ mở

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

Theo như tôi hiểu, anh ấy đang tìm kiếm giải pháp rút ra nhận xét nhiều dòng: Nếu tôi có một khối gồm n dòng, tôi chỉ muốn có thể thêm một dòng ở đầu và cuối (hoặc có thể là một vài dòng) và có công việc. Tôi không muốn phải chỉnh sửa toàn bộ khối.
dionyziz.

6

Vì bạn có thể sử dụng <% %>để đặt một khối ruby, nên nó chắc chắn có thể được sử dụng để đưa vào các bình luận.

Một giải pháp đơn giản và thanh lịch sẽ trông giống như ...

<%
# 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
Điều này không hiệu quả. Bất kỳ thẻ ruby ​​nào bên trong nhận xét khối sẽ đóng khối bên ngoài.
Hovis Biddle

4

After = begin bạn không cần phải đặt%>

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

Chỉ là một phụ lục cho một số câu trả lời trước đó. Tôi thấy giải pháp = begin / = end hữu ích nhất, nhưng để làm đẹp, tôi viết nó như vậy:

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

Lưu ý rằng vì mọi thứ đều bị bỏ qua cho đến khi =endkhông cần đóng =beginthẻ bằng %>hoặc mở =endthẻ bằng <%(cũng đã được chỉ ra trong câu trả lời trước đó)

Tôi thấy đây là giải pháp thanh lịch nhất để vượt qua hoàn toàn một khối mã ruby ​​và html hỗn hợp và nó cũng có màu xám trong trình soạn thảo của tôi, trái ngược với <% if false %>giải pháp. Chỉ có một nhược điểm là =begin=endphải được đặt ở đầu dòng ..


1
Tôi nhận được lỗi này: "tài liệu nhúng gặp cuối tệp"
Kieran Andrews

2

Sử dụng HEREDOC được gọi là bình luận

Ưu điểm:

  • Tự giải thích rằng đây là một nhận xét
  • Hoạt động cho các thẻ erb và HTML
  • Có đánh dấu cú pháp ok (dưới dạng một chuỗi dài)

Nhược điểm:

  • Cú pháp đóng 3 dòng kỳ lạ
  • Không có phím tắt

Mã:

Thẻ mở có thể là

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

hoặc là

<%
<<-COMMENT
%>

Mọi thứ ở đây sẽ không chạy hoặc hiển thị trong trình duyệt

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

Thẻ đóng

có, nó cần phải là 3 dòng 😟. Tôi không biết tại sao thẻ erb mở lại quan trọng nhưng nó là như vậy! (trừ khi bạn không sử dụng bất kỳ thẻ erb nào trong nhận xét).

<%      
COMMENT
%>

1

Bạn phải ghi nhớ nơi mã được thực thi. Nhận xét kiểu Ruby hoạt động vì mã Ruby được thực thi trên máy chủ trước khi nó được cung cấp cho trình duyệt web. Điều này cũng giải thích tại sao các bình luận HTML không hoạt động — Ruby đã được thực thi.

IDE bạn đang sử dụng không hỗ trợ tạo macro tùy chỉnh để nhận xét các khối mã?


1) bạn nói đúng, bình luận jsp có định dạng hơi khác, tôi đã cập nhật bài đăng. 2) Tôi không thể tìm thấy bất kỳ thứ gì tương tự như vậy trong IDEA hoặc Netbeans. Bạn có bất kỳ IDE cụ thể nào trong đầu khi nói điều này không?
Nikita Rybak

1
Không, tôi không có. Cá nhân tôi không sử dụng IDE cho các dự án Rails.
John Topley

1

Phím tắt nhận xét khối của Sublime Text ctrl+shift+/thông báo liệu bạn đã chọn HTML bình thường hay thẻ Erb và đặt <!---hoặc <% =begin %>tương ứng.


Có, nhưng điều này vẫn sẽ không bình luận về cả HTML ruby.
Adamantish

Hmm ... nghe có vẻ là lý do chính đáng cho một plugin tùy chỉnh. Có thể là một stopgap, bạn có thể nhấn ctrl+dđể chọn nhiều lần bắt đầu của mọi thẻ Erb <%trong khối rồi nhấn ctrl+shift+/, sau đó nhấn nó một lần nữa để toàn bộ khối nhận xét ra HTML.
iono

1

Bạn có thể sử dụng cả nhận xét <% if false%> và HTML cùng một lúc:

<%if false%><--

stuff to comment out

--><%end%>

Những lợi ích là:

  • Mã Ruby không được thực thi

  • Khối được nhận xét có màu xám trong IDE

  • Ý định là rõ ràng đối với các nhà phát triển khác


0

Đây là người duy nhất làm việc cho tôi.

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

Tôi hy vọng tôi vừa thổi bay tâm trí của bạn!


-4

Giải pháp duy nhất có thể chấp nhận được mà tôi từng tìm thấy cho vấn đề tồn đọng này là đặt một khoảng trắng trong "<% =" để làm cho nó không còn đăng ký dưới dạng mã ruby ​​nữa và sau đó nhận xét toàn bộ khối bằng các nhận xét html

Như thế này:

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

Có, việc thêm các khoảng trắng là khó chịu. Nhưng nó là ít gây khó chịu nhất trong tất cả các giải pháp mà tôi đã từng thấy.


1
Bạn cũng có thể chỉ cần thêm một #... thay vì gửi ruby ​​trong tài liệu.
tối đa
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.