Sự khác biệt giữa <%, <% =, <% # và -%> trong ERB trong Rails là gì?


368

Ai đó có thể vui lòng mô tả việc sử dụng các ký tự sau được sử dụng trong tệp ERB:

<%   %>
<%=  %>
<%  -%>
<%#  %>

cách sử dụng của mỗi người là gì?


1
Bạn đã có một số câu trả lời tuyệt vời ở đây. Cũng lưu ý rằng Haml thường là một sự thay thế vượt trội so với ERb.
Marnen Laibow-Koser

1
Vâng, nó dễ đối phó hơn nhiều so với ERb
simo


@Ciro Santilli: Mặc dù tuổi tác, nhưng điều này có vẻ đầy đủ hơn so với tài liệu tham khảo của bạn. Tôi đang bỏ phiếu để đóng những cái đó như là bản sao của cái này ..
Brad Werth

<%= %><%= -%>là khác nhau: chỉ có cái sau loại bỏ khoảng trắng dấu.
ảo ảnh

Câu trả lời:


476
<% %>

Thực thi mã ruby ​​trong ngoặc.

<%= %>

In một cái gì đó vào tập tin erb.

<% -%>

Tránh ngắt dòng sau khi biểu thức.

<%# %>

Nhận xét ra mã trong ngoặc; không được gửi cho khách hàng (trái ngược với nhận xét HTML).

Ghé thăm Ruby Doc để biết thêm thông tin về ERB.


17
Tôi đã gặp một nơi nào đó trong mã biến thể này <% ==%> có ai biết nó là gì không?
okliv

38
Nhân đôi có nghĩa là chuỗi không được thoát, như trong raw.
Richard_G


3
Nhưng ... nhưng ... <%#chỉ là bình thường <%với một nhận xét về Ruby #ngay sau đó .... Vâng, thật vui khi nghĩ nó có gì đó đặc biệt, nhưng không phải nó chỉ là một thành ngữ ERB chứ không phải là một cấu trúc cú pháp đặc biệt?
BalinKingOfMoria Phục hồi CM

6
@QPaysTaxes xin lỗi về điều đó, bạn nói đúng ... Ví dụ: nếu bạn có ERB đa dòng <%...%>, hãy <%#...%>bình luận tất cả , điều đó sẽ không xảy ra nếu đó chỉ là một nhận xét bình thường (nghĩa là nó sẽ chỉ nhận xét ra dòng nó vào).
BalinKingOfMoria Phục hồi CM

86

<% %><%- and -%>dành cho bất kỳ mã Ruby nào, nhưng không đưa ra kết quả (ví dụ: nếu các câu lệnh). hai cái giống nhau

<%= %> là để xuất kết quả của mã Ruby

<%# %> là một bình luận ERB

Đây là một hướng dẫn tốt: http://api.rubyonrails.org/groupes/ActionView/Base.html


Tôi không thấy rằng việc mở <%-làm bất cứ điều gì cho khoảng trắng hàng đầu và tôi không thấy nó được ghi lại ở bất cứ đâu. Bạn có chắc chắn về điều đó không? Có lẽ đó là một hương vị khác nhau của ERB. Không có tùy chọn hiển thị cho nó trên các tài liệu stdlib.
Andrew Vit

1
@AndrewVit - Từ trang được tham chiếu trong câu trả lời này (ActionView :: trang tài liệu cơ sở): "<% - và -%> triệt tiêu khoảng trắng hàng đầu và dấu, bao gồm dòng mới, và có thể được sử dụng thay thế cho nhau với <% và%>. "
Bá tước Jenkins

5
Làm cách nào để loại bỏ khoảng trắng hàng đầu cho <% =%>?
Bogdan Gusiev

52

Rails không sử dụng ERB của stdlib theo mặc định, nó sử dụng erubis . Nguồn: nhận xét của nhà phát triển này , gempec của ActionView , yêu cầu hợp nhất được chấp nhận mà tôi đã thực hiện trong khi viết này .

những khác biệt hành vi giữa chúng, đặc biệt là về cách các nhà khai thác gạch nối %--%làm việc.

Tài liệu khan hiếm, định dạng ERB của Ruby "chính thức" được định nghĩa ở đâu? Vì vậy, những gì sau đây là kết luận theo kinh nghiệm.

Tất cả các thử nghiệm giả sử:

require 'erb'
require 'erubis'

Khi nào bạn có thể sử dụng -

  • ERB: bạn phải vượt qua -để trim_modelựa chọn ERB.newđể sử dụng nó.
  • erubis: được bật theo mặc định.

Ví dụ:

begin ERB.new("<%= 'a' -%>\nb").result; rescue SyntaxError ; else raise; end
ERB.new("<%= 'a' -%>\nb"  , nil, '-') .result == 'ab'  or raise
Erubis::Eruby.new("<%= 'a' -%>  \n b").result == 'a b' or raise

Có gì -%không:

  • ERB: xóa ký tự tiếp theo nếu đó là dòng mới.

  • erubis:

    • trong <% %>(không có =), -là vô dụng vì <% %><% -%>giống nhau. <% %>xóa dòng hiện tại nếu nó chỉ chứa khoảng trắng và không làm gì khác.

    • trong <%= -%>(với =):

      • xóa toàn bộ dòng nếu nó chỉ chứa khoảng trắng
      • mặt khác, nếu không có khoảng trắng trước thẻ và chỉ có các khoảng trắng sau, hãy xóa các khoảng trắng xuất hiện sau
      • khác, có một khoảng trắng sau thẻ: không làm gì cả

Ví dụ:

# Remove
ERB.new("a \nb <% 0 -%>\n c", nil, '-').result == "a \nb  c" or raise

# Don't do anything: not followed by newline, but by space:
ERB.new("a\n<% 0 -%> \nc", nil, '-').result == "a\nb \nc" or raise

# Remove the current line because only whitesapaces:
Erubis::Eruby.new(" <% 0 %> \nb").result == 'b' or raise

# Same as above, thus useless because longer.
Erubis::Eruby.new(" <% 0 -%> \nb").result == 'b' or raise

# Don't do anything because line not empty.
Erubis::Eruby.new("a <% 0 %> \nb").result == "a  \nb" or raise
Erubis::Eruby.new(" <% 0 %> a\nb").result == "  a\nb" or raise
Erubis::Eruby.new(" <% 0 -%> a\nb").result == "  a\nb" or raise

# Don't remove the current line because of `=`:
Erubis::Eruby.new(" <%= 0 %> \nb").result == " 0 \nb" or raise

# Remove the current line even with `=`:
Erubis::Eruby.new(" <%= 0 -%> \nb").result == " 0b"   or raise

# Remove forward only because of `-` and non space before:
Erubis::Eruby.new("a <%= 0 -%> \nb").result == "a 0b"   or raise

# Don't do anything because non-whitespace forward:
Erubis::Eruby.new(" <%= 0 -%> a\nb").result == " 0 a\nb"   or raise

Có gì %-không:

  • ERB: xóa các khoảng trắng trước thẻ và sau các dòng mới trước đó, nhưng chỉ khi chỉ có các khoảng trắng trước đó.

  • erubis: vô dụng vì <%- %>giống như <% %>(không có =) và điều này không thể được sử dụng với =trường hợp duy nhất -%có thể hữu ích. Vì vậy, không bao giờ sử dụng này.

Ví dụ:

# Remove
ERB.new("a \n  <%- 0 %> b\n c", nil, '-').result == "a \n b\n c" or raise

# b is not whitespace: do nothing:
ERB.new("a \nb  <%- 0 %> c\n d", nil, '-').result == "a \nb   c\n d" or raise

Làm gì %--%làm gì với nhau

Sự kết hợp chính xác của cả hai hiệu ứng riêng biệt.


1
Trên dòng thứ hai, bạn đã viết rằng Rails sử dụng eruby trong khi liên kết với erubis.
Daniel Jonsson

1
@DanielJonsson cảm ơn vì báo cáo: nó có nghĩa là erubis. Đi hạt với rất nhiều phiên bản. Cập nhật.
Ciro Santilli 郝海东 冠状 病 事件

10
  • <% %> : Thực thi mã ruby
  • <%= %>: In thành tập tin Erb. Hoặc trình duyệt
  • <% -%> : Tránh ngắt dòng sau khi biểu thức.
  • <%# %> : Bình luận ERB

7

Tôi đã thêm <%%dấu phân cách thẻ theo nghĩa đen như một câu trả lời cho điều này vì sự tối nghĩa của nó. Điều này sẽ yêu cầu erb không diễn giải <%phần thẻ cần thiết cho các ứng dụng js như hiển thị các chú giải công cụ chart.js, v.v.

Cập nhật (Đã sửa lỗi liên kết bị hỏng)

Bây giờ mọi thứ về ERB có thể được tìm thấy ở đây: https://puppet.com/docs/puppet/5.3/lang_template_erb.html#tags


1
liên kết này trả lời OP chính xác
Ben Tinsley

Liên kết hiện đã bị hỏng
andreofthecape

Cập nhật với liên kết mới!
bkunzi01

3

Chúng được sử dụng trong ruby ​​trên đường ray : -

<%%>: -

Các thẻ <%%> được sử dụng để thực thi mã Ruby không trả về bất cứ thứ gì, chẳng hạn như điều kiện, vòng lặp hoặc khối. Ví dụ :-

<h1>Names of all the people</h1>
<% @people.each do |person| %>
  Name: <%= person.name %><br>
<% end %>

<% =%>: -

sử dụng để hiển thị nội dung.

Name: <%= person.name %><br>

<% -%>: -

Rails mở rộng ERB, để bạn có thể chặn dòng mới chỉ bằng cách thêm dấu gạch nối vào các thẻ trong mẫu Rails

<% #%>: -

nhận xét mã

<%# WRONG %>
Hi, Mr. <% puts "Frodo" %>

1

<% %>thực thi mã trong đó nhưng không in kết quả, ví dụ:
Chúng ta có thể sử dụng nó nếu khác trong tệp erb.

<% temp = 1 %>
<% if temp == 1%>
  temp is 1
<% else %>
  temp is not 1
<%end%>  

Sẽ in temp is 1


<%= %>thực thi mã và cũng in ra đầu ra, ví dụ:
Chúng ta có thể in giá trị của biến rails.

<% temp = 1 %>
<%= temp %>  

Sẽ in 1


<% -%>Nó không có gì khác biệt vì nó không in bất cứ thứ gì, -%>chỉ có ý nghĩa với <%= -%>, điều này sẽ tránh một dòng mới.


<%# %> sẽ bình luận mã được viết trong này.

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.