Apa perbedaan antara <%, <% =, <% # dan -%> di ERB di Rails?

368

Bisakah seseorang tolong jelaskan penggunaan karakter berikut yang digunakan dalam file ERB:

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

apa gunanya masing-masing?

simo
sumber
1
Anda mendapat jawaban yang bagus di sini. Perhatikan juga bahwa Haml sering merupakan alternatif yang unggul untuk ERb.
Marnen Laibow-Koser
1
Ya, ini jauh lebih mudah untuk ditangani daripada ERb
simo
1
kemungkinan duplikat Perbedaan antara -%> dan%> di rel untuk -%>, dan stackoverflow.com/questions/3952403/... for <%=, stackoverflow.com/questions/3901619/… for <%#.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
@Ciro Santilli: Terlepas dari usia, yang ini tampaknya lebih lengkap daripada referensi Anda. Saya memilih untuk menutup itu sebagai duplikat dari yang ini ..
Brad Werth
<%= %>dan <%= -%>berbeda: hanya yang kedua yang menghilangkan spasi spasi putih.
ilusionis

Jawaban:

476
<% %>

Menjalankan kode ruby ​​di dalam kurung.

<%= %>

Mencetak sesuatu ke file erb.

<% -%>

Hindari jeda baris setelah ekspresi.

<%# %>

Mengomentari kode dalam kurung; tidak dikirim ke klien (sebagai lawan dari komentar HTML).

Kunjungi Ruby Doc untuk info lebih lanjut tentang ERB.

Auralbee
sumber
17
saya telah bertemu di suatu tempat dalam kode varian ini lain <% ==%> apakah ada yang tahu apa itu?
okliv
38
Sama dengan dobel berarti string tidak lepas, seperti pada raw.
Richard_G
7
Rails tidak menggunakan stdlib ERB: ia menggunakan erubis: github.com/rails/rails/issues/16766#issuecomment-54148778
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
3
Tapi ... tapi ... <%#hanya normal <%dengan komentar Ruby #tepat setelah itu .... Ya, menyenangkan untuk berpikir itu sesuatu yang istimewa, tetapi bukankah itu hanya idiom ERB daripada konstruksi sintaksis khusus?
BalinKingOfMoria Reinstate CMs
6
@QPaysTaxes menyesal tentang hal itu, Anda benar ... Misalnya, jika Anda memiliki ERB multiline <%...%>, <%#...%>komentar semua itu, yang tidak akan dilakukan jika itu hanya komentar normal (yaitu hanya akan berkomentar di luar garis aktif).
BalinKingOfMoria Reinstate CMs
86

<% %>dan <%- and -%>untuk kode Ruby apa pun, tetapi tidak menampilkan hasilnya (misalnya jika pernyataan). keduanya sama.

<%= %> adalah untuk mengeluarkan hasil dari kode Ruby

<%# %> adalah komentar ERB

Berikut panduan yang bagus: http://api.rubyonrails.org/classes/ActionView/Base.html

yalestar
sumber
Saya tidak melihat pembukaan yang <%-melakukan apa pun untuk memimpin spasi putih, dan saya tidak melihatnya didokumentasikan di mana pun. Apa kamu yakin akan hal itu? Mungkin itu rasa ERB yang berbeda. Tidak ada opsi yang ditampilkan di stdlib docs.
Andrew Vit
1
@AndrewVit - Dari halaman yang dirujuk dalam jawaban ini (ActionView :: Base docs page): "<% - and -%> menekan spasi spasi awalan dan jejak, termasuk baris tambahan, dan dapat digunakan secara bergantian dengan <% dan%>. "
Earl Jenkins
5
Bagaimana cara menekan spasi putih terdepan untuk <% =%>?
Bogdan Gusiev
52

Rails tidak menggunakan ERB stdlib secara default, ia menggunakan erubis . Sumber: komentar dev ini , gemspec ActionView , menerima permintaan gabungan yang saya lakukan saat menulis ini .

Ada yang perbedaan perilaku antara mereka, khususnya pada bagaimana operator tanda hubung %-dan -%pekerjaan.

Dokumentasi langka, Di mana format ERB Ruby "resmi" didefinisikan? jadi yang berikut adalah kesimpulan empiris.

Semua tes misalkan:

require 'erb'
require 'erubis'

Kapan bisa digunakan -

  • ERB: Anda harus beralih -ke trim_modeopsi ERB.newuntuk menggunakannya.
  • erubis: diaktifkan secara default.

Contoh:

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

Apa yang -%dilakukan:

  • ERB: hapus karakter berikutnya jika itu adalah baris baru.

  • erubis:

    • di <% %>(tanpa =), -tidak berguna karena <% %>dan <% -%>sama. <% %>menghapus baris saat ini jika hanya berisi spasi putih, dan tidak melakukan apa pun sebaliknya.

    • dalam <%= -%>(dengan =):

      • hapus seluruh baris jika hanya berisi spasi putih
      • lain, jika ada spasi sebelum tag, dan hanya whitesapces setelah, hapus whitespces yang datang setelah
      • selain itu, ada spasi setelah tag: do nothing

Contoh:

# 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

Apa yang %-dilakukan:

  • ERB: hapus spasi putih sebelum tag dan setelah baris baru sebelumnya, tetapi hanya jika hanya ada spasi putih sebelumnya.

  • erubis: tidak berguna karena <%- %>sama dengan <% %>(tanpa =), dan ini tidak dapat digunakan dengan =satu-satunya kasus di mana -%dapat berguna. Jadi jangan pernah gunakan ini.

Contoh:

# 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

Apa %-dan -%lakukan bersama

Kombinasi yang tepat dari kedua efek secara terpisah.

Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
sumber
1
Pada baris kedua Anda telah menulis bahwa Rails menggunakan eruby saat menghubungkan ke erubis.
Daniel Jonsson
1
@DanielJonsson terima kasih atas laporannya: itu dimaksudkan untuk menjadi erubis. Menjadi gila dengan begitu banyak versi. Diperbarui.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
10
  • <% %> : Menjalankan kode ruby
  • <%= %>: Mencetak ke dalam file Erb. Atau peramban
  • <% -%> : Menghindari jeda baris setelah ekspresi.
  • <%# %> : Komentar ERB
Neha Nakrani
sumber
7

Saya telah menambahkan <%%pembatas tag literal sebagai jawaban untuk ini karena ketidakjelasannya. Ini akan memberitahu erb untuk tidak menafsirkan <%bagian dari tag yang diperlukan untuk aplikasi js seperti menampilkan tooltips chart.js dll.

Perbarui (Memperbaiki tautan rusak)

Segala sesuatu tentang ERB sekarang dapat ditemukan di sini: https://puppet.com/docs/puppet/5.3/lang_template_erb.html#tags

bkunzi01
sumber
1
tautan ini menjawab OP secara akurat
Ben Tinsley
Tautan sekarang rusak
andreofthecape
Diperbarui dengan tautan baru!
bkunzi01
3

Ini digunakan dalam ruby ​​di rel : -

<%%>: -

Tag <%%> digunakan untuk mengeksekusi kode Ruby yang tidak mengembalikan apa pun, seperti kondisi, loop, atau blok. Misalnya: -

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

<% =%>: -

gunakan untuk menampilkan konten.

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

<% -%>: -

Rail memanjang ERB, sehingga Anda bisa menekan baris baru hanya dengan menambahkan tanda hubung tambahan ke tag dalam templat Rails

<% #%>: -

komentar kodenya

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

<% %>mengeksekusi kode di sana tetapi tidak mencetak hasilnya, misalnya:
Kita dapat menggunakannya untuk jika lain dalam file erb.

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

Akan dicetak temp is 1


<%= %>mengeksekusi kode dan juga mencetak output, misalnya:
Kita dapat mencetak nilai variabel rails.

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

Akan dicetak 1


<% -%>Tidak ada bedanya karena tidak mencetak apa pun, -%>hanya masuk akal <%= -%>, ini akan menghindari baris baru.


<%# %> akan mengomentari kode yang tertulis di dalamnya.

Aastha Kesarwani
sumber