RailsのERBの<%、<%=、<%#および-%>の違いは何ですか?


368

ERBファイルで使用されている次の文字の使用方法を説明できますか?

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

それぞれの使用法は何ですか?


1
ここにいくつかの素晴らしい答えがあります。また、Hamlは多くの場合、ERbに代わる優れた方法であることにも注意してください。
Marnen Laibow-Koser

1
はい、ERbよりも処理がはるかに簡単です
simo


@Ciro Santilli:年齢にもかかわらず、これはあなたの参照よりも完全なようです。私はそれらをこの1つの複製として閉じるように投票します..
ブラッド・ウェルス

<%= %><%= -%>は異なります。後者のみが末尾の空白を削除します。
イリュージョニスト

回答:


476
<% %>

括弧内のルビコードを実行します。

<%= %>

erbファイルに何かを出力します。

<% -%>

式の後の改行を避けます。

<%# %>

大括弧内のコードをコメント化します。(HTMLコメントとは対照的に)クライアントには送信されません。

ERBの詳細については、Ruby Docにアクセスしてください。


17
私はコードのどこかでこのバリアントに会ったことがあります<%==%>誰かがそれが何であるか知っていますか?
okliv

38
二重等号は、文字列がrawのようにエスケープされないことを意味します。
Richard_G 2014年

7
Railsはstdlib ERBを使用しません:erubisを
Ciro Santilli郝海东冠状病六四事件法轮功

3
しかし......しかし... Rubyコメントの<%#直後にあるのは普通のことです...ええ、それを何か特別なものだと考えるのは楽しいですが、それは特別な構文構成ではなく単なるERBイディオムではありませんか?<%#
BalinKingOfMoria 2015

6
@QPaysTaxes申し訳ありませんが、そうです...たとえば、複数行のERB がある場合、そのすべてをコメント化します。通常のコメントだけの場合は<%...%><%#...%>コメント化しません(つまり、行だけをコメント化します)オンです)。
BalinKingOfMoria 2016

86

<% %>および<%- and -%>任意のRubyコード用ですが、結果を出力しません(ifステートメントなど)。2つは同じです。

<%= %> Rubyコードの結果を出力するためのものです

<%# %> ERBコメントです

ここに良いガイドがあります:http : //api.rubyonrails.org/classes/ActionView/Base.html


冒頭の<%-空白が先頭に何もしないことはわかりませんし、どこにも記載されていません。よろしいですか?多分それはERBの別の味です。stdlibのドキュメントには、そのオプションは表示されていません。
Andrew Vit 2013

1
@AndrewVit-この回答で参照されているページ(ActionView :: Base docsページ)から:「<%-および-%>は、後続の改行を含め、先行および後続の空白を抑制し、<%および%>と交換可能に使用できます。 」
Earl Jenkins

5
<%=%>の先頭の空白を抑制する方法は?
Bogdan Gusiev 2014

52

RailsはデフォルトでstdlibのERBを使用せerubisを使用します。ソース:この開発者のコメントActionViewのgemspecこれを書いているときに私が行ったマージ要求を受け入れました

それらの間には、特にハイフン演算子と機能の動作に違いがあります%--%

ドキュメントが不足しています。Rubyの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:改行の場合、次の文字を削除します。

  • エルビス:

    • <% %>(なしで=)とは同じである-ため<% %>、役に立たない<% -%><% %>空白のみが含まれている場合は現在の行を削除し、それ以外の場合は何も行いません。

    • 中に<%= -%>(と=):

      • 空白のみが含まれている場合は、行全体を削除します
      • それ以外の場合、タグの前に非スペースがあり、その後にのみホワイトスペースがある場合は、後に来るホワイトスペースを削除します
      • それ以外の場合、タグの後にスペース以外があります:何もしない

例:

# 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
2行目で、Railsはエルビスにリンクするときにerubyを使用することを記述しました。
Daniel Jonsson 2014

1
@DanielJonssonはレポートをありがとう:それはエルビスであることを意味していました。非常に多くのバージョンで気が狂います。更新しました。
Ciro Santilli郝海东冠状病六四事件法轮功

10
  • <% %> :rubyコードを実行します
  • <%= %>:Erbファイルに出力します。またはブラウザ
  • <% -%> :式の後の改行を回避します。
  • <%# %> :ERBコメント

7

<%%あいまいなため、これに対する答えとしてリテラルタグ区切り文字を追加しました。これは、erb <%に、chart.jsツールチップの表示などのjsアプリに必要なタグの部分を解釈しないように指示します。

更新(リンク切れの修正)

ERBに関するすべてがここにあります:https : //puppet.com/docs/puppet/5.3/lang_template_erb.html#tags


1
このリンクはOPに正確に回答します
Ben Tinsley 2017年

リンクが壊れています
andreofthecape

新しいリンクで更新されました!
bkunzi01

3

これらは、Ruby on Railsで使用されます

<%%>:-

<%%>タグは、条件、ループ、ブロックなど、何も返さない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


<%= %>コードを実行し、出力も出力します。例:
rails変数の値を出力できます。

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

印刷します 1


<% -%>何も印刷されないので違いはありません。で-%>のみ意味があり<%= -%>、これにより新しい行が回避されます。


<%# %> これで書かれたコードをコメントアウトします。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.