อะไรคือความแตกต่างระหว่าง <%, <% =, <% # และ -%> ใน ERB ใน Rails?


368

บางคนได้โปรดอธิบายการใช้อักขระต่อไปนี้ซึ่งใช้ในไฟล์ ERB:

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

การใช้งานของแต่ละคนคืออะไร?


1
คุณได้รับคำตอบที่ดีที่นี่ โปรดทราบว่า Haml มักเป็นทางเลือกที่ดีกว่าของ ERb
Marnen Laibow-Koser

1
ใช่มันง่ายกว่าที่จะจัดการกับมากกว่า ERb
simo


@Ciro Santilli: แม้จะอายุมาก แต่อันนี้ก็ดูสมบูรณ์กว่าการอ้างอิงของคุณ ฉันลงคะแนนเพื่อปิดเหล่านั้นเป็นของหลอกคนนี้ ..
แบรดเวิร์ ธ

<%= %>และ<%= -%>มีความแตกต่าง: มีเพียงหลังเท่านั้นที่ลบ whitespaces ต่อท้าย
นักเล่นกลลวงตา

คำตอบ:


476
<% %>

เรียกใช้งานรหัสทับทิมภายในวงเล็บ

<%= %>

พิมพ์บางอย่างลงในไฟล์ erb

<% -%>

หลีกเลี่ยงการแบ่งบรรทัดหลังนิพจน์

<%# %>

คอมเม้นท์โค้ดภายในวงเล็บ; ไม่ส่งถึงลูกค้า (ตรงข้ามกับความคิดเห็น HTML)

เยี่ยมชมRuby Docสำหรับข่าวสารเพิ่มเติมเกี่ยวกับ ERB


17
ฉันพบรหัสบางอย่างในตัวแปรนี้ <% ==%> ไม่มีใครรู้ว่ามันคืออะไร
okliv

38
สองเท่ากันหมายความว่าสตริงไม่ได้หลบหนีเช่นเดียวกับในดิบ
Richard_G


3
แต่ ... แต่ ... <%#เป็นเพียงเรื่องปกติที่<%มีความคิดเห็นทับทิม#หลังจากนั้น .... ใช่มันสนุกที่จะคิดว่ามันเป็นอะไรที่พิเศษ แต่มันไม่ใช่แค่สำนวนของ ERB แทนที่จะเป็นโครงสร้างประโยคแบบพิเศษใช่ไหม
BalinKingOfMoria คืนค่า CM ใหม่

6
@QPaysTaxes ขออภัยเกี่ยวกับที่คุณขวา ... ตัวอย่างเช่นถ้าคุณมีหลาย ERB <%...%>, <%#...%>ความคิดเห็นออกทั้งหมดของมันซึ่งมันจะไม่ทำถ้ามันเป็นเพียงแค่ความคิดเห็นตามปกติ (คือมันจะเพียงแสดงความคิดเห็นออกบรรทัด มันอยู่)
BalinKingOfMoria กลับสู่สถานะเดิม CM

86

<% %>และ<%- and -%>สำหรับโค้ด Ruby ใด ๆ แต่จะไม่แสดงผลลัพธ์ (เช่นถ้ามีคำสั่ง) ทั้งสองเหมือนกัน

<%= %> ใช้สำหรับแสดงผลลัพธ์ของรหัส Ruby

<%# %> เป็นความคิดเห็น ERB

นี่คือคำแนะนำที่ดี: http://api.rubyonrails.org/classes/ActionView/Base.html


ฉันไม่เห็นว่าการเปิด<%-นั้นทำอะไรเพื่อนำช่องว่างและฉันไม่เห็นว่ามีการบันทึกไว้ที่ใด คุณแน่ใจเหรอ อาจเป็นรสชาติที่แตกต่างของ ERB ไม่มีตัวเลือกแสดงอยู่ใน stdlib docs
Andrew Vit

1
@AndrewVit - จากหน้าอ้างอิงในคำตอบนี้ (หน้า ActionView :: Base docs): "<% - and -%> ยับยั้งช่องว่างนำหน้าและต่อท้ายรวมถึงบรรทัดใหม่ที่ต่อท้ายและสามารถใช้แทนกันได้กับ <% และ%> "
Earl Jenkins

5
วิธีการระงับช่องว่างนำหน้าสำหรับ <% =%>
Bogdan Gusiev

51

ทางรถไฟไม่ได้ใช้STDLIB ของ ERBโดยค่าเริ่มต้นจะใช้erubis แหล่งที่มา: ความคิดเห็นของ dev นี้ , gemspec ActionView ของ , คำขอผสานยอมรับฉันทำในขณะที่เขียนนี้

มีมีความแตกต่างของพฤติกรรมระหว่างพวกเขาโดยเฉพาะอย่างยิ่งเกี่ยวกับวิธีที่ผู้ประกอบการยัติภังค์%-และ-%การทำงาน

เอกสารมีน้อยรูปแบบ ERB ของรูบี้ "ถูกกำหนด" เป็นทางการแล้วอยู่ที่ไหน ดังนั้นสิ่งที่ตามมาคือข้อสรุปเชิงประจักษ์

การทดสอบทั้งหมดสมมติว่า:

require 'erb'
require 'erubis'

เมื่อคุณสามารถใช้ -

  • ERB: คุณจะต้องผ่าน-ไปยังtrim_modeตัวเลือกในการERB.newที่จะใช้มัน
  • erubis: เปิดใช้งานโดยค่าเริ่มต้น

ตัวอย่าง:

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

อะไร-%:

  • ERB: ลบอักขระถัดไปหากเป็นบรรทัดใหม่

  • erubis:

    • ใน<% %>(ไม่=) -ไม่มีประโยชน์เพราะ<% %>และ<% -%>เหมือนกัน <% %>ลบบรรทัดปัจจุบันออกหากมีเพียงช่องว่างและไม่ทำอะไรเลย

    • ใน<%= -%>(กับ=):

      • ลบทั้งบรรทัดหากมีเพียงช่องว่าง
      • ถ้าไม่มีช่องว่างหน้าแท็กและมีเพียง whitesapces after ให้ลบ whitespces ที่ตามหลังมา
      • มิฉะนั้นจะมีช่องว่างด้านหลังแท็ก: ไม่ทำอะไรเลย

ตัวอย่าง:

# 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

อะไร%-:

  • ERB: ลบช่องว่างก่อนหน้าแท็กและหลังบรรทัดใหม่ก่อนหน้า แต่เฉพาะในกรณีที่มีช่องว่างก่อนหน้าเท่านั้น

  • erubis: ไร้ประโยชน์เพราะ<%- %>เหมือนกับ<% %>(ไม่รวม=) และสิ่งนี้ไม่สามารถใช้กับ=กรณีที่-%เป็นประโยชน์เท่านั้น ดังนั้นอย่าใช้สิ่งนี้

ตัวอย่าง:

# 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

ทำอะไร%-และ-%ทำด้วยกัน

การรวมกันที่แน่นอนของผลทั้งสองแยกจากกัน


1
ในบรรทัดที่สองคุณเขียนว่า Rails ใช้ eruby ขณะเชื่อมโยงไปยัง erubis
Daniel Jonsson

1
@DanielJonsson ขอบคุณสำหรับรายงาน: มันควรจะเป็น erubis ไปถั่วกับหลายรุ่น Updated
Ciro Santilli 郝海东冠状病六四事件法轮功

10
  • <% %> : เรียกใช้งานรหัสทับทิม
  • <%= %>: พิมพ์ลงในไฟล์ Erb หรือเบราว์เซอร์
  • <% -%> : หลีกเลี่ยงการแบ่งบรรทัดหลังนิพจน์
  • <%# %> : ความคิดเห็น ERB

7

ฉันได้เพิ่ม<%%ตัวคั่นแท็กตามตัวอักษรเป็นคำตอบสำหรับเรื่องนี้เพราะความสับสน สิ่งนี้จะบอกให้ erb ไม่ตีความ<%ส่วนของแท็กที่จำเป็นสำหรับแอป js เช่นการแสดงคำแนะนำเครื่องมือ chart.js เป็นต้น

อัปเดต (ลิงก์ที่ใช้งานไม่ได้)

ทุกอย่างเกี่ยวกับ ERB สามารถพบได้ที่นี่: https://puppet.com/docs/puppet/5.3/lang_template_erb.html#tags


1
การเชื่อมโยงนี้สามารถตอบได้อย่างถูกต้อง OP
เบน Tinsley

ลิงก์ใช้งานไม่ได้ในตอนนี้
andreofthecape

อัปเดตด้วยลิงก์ใหม่!
bkunzi01

3

ใช้ในทับทิมบนราง : -

<%%>: -

แท็ก <%%> ใช้เพื่อเรียกใช้โค้ด Ruby ที่ไม่ส่งคืนสิ่งใด ๆ เช่นเงื่อนไขลูปหรือบล็อก เช่น :-

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

<% =%>: -

ใช้เพื่อแสดงเนื้อหา

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

<% -%>: -

Rails ขยาย ERB เพื่อให้คุณสามารถระงับการขึ้นบรรทัดใหม่ได้อย่างง่ายดายโดยการเพิ่มยัติภังค์ต่อท้ายไปยังแท็กในแม่แบบ Rails

<% #%>: -

แสดงความคิดเห็นรหัส

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

1

<% %>รันรหัสในนั้น แต่ไม่ได้พิมพ์ผลเช่น:
เราสามารถใช้มันสำหรับถ้าอื่นในไฟล์ erb

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

จะพิมพ์ temp is 1


<%= %>รันรหัสและพิมพ์ผลลัพธ์เช่น:
เราสามารถพิมพ์ค่าของตัวแปรราง

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

จะพิมพ์ 1


<% -%>มันไม่มีความแตกต่างเพราะมันไม่ได้พิมพ์อะไร-%>เพียงมีเหตุผล<%= -%>ก็จะหลีกเลี่ยงบรรทัดใหม่


<%# %> จะแสดงความคิดเห็นรหัสที่เขียนภายในสิ่งนี้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.