メールを送信するためのERBテンプレートがあります。
Name: <%= @user.name %>
<% if @user.phone.present? %>
Phone: <%= @user.phone %>
<% end %>
Address: <%= @user.address %>
Name
が空のときに、Address
とPhone
の間の空白行を削除しようとしています。
返された結果
Name: John Miller
Address: X124 Dummy Lane, Dummy City, CA
期待される結果
Name: John Miller
Address: X124 Dummy Lane, Dummy City, CA
<%--%>
タグ(末尾の改行を削除するため)を使用しようとしましたが、成功しませんでした。
Name: <%= @user.name %>
<%- if @user.phone.present? -%>
Phone: <%= @user.phone %>
<%- end -%>
Address: <%= @user.address -%>
この問題を回避するにはどうすればよいですか?
PS:私はRails 2.3.8です。
注1
現在、私はRuby hackeryを使用して問題を回避しています。
ヘルパーメソッド:
def display_fields(names, user)
names.collect do |name|
value = user.send(name)
"#{name}: #{value}" unless value.blank?
end.compact.join("\n")
end
コードを表示
<%= display_fields(["Name", "Phone", "Address"], @user) %>
しかし、これは私にはかなり不格好に見えます。誰かがERBビューテンプレートで<%--%>
を動作させることができたかどうかを知りたいです。
トリムモードを有効にするには、3番目のパラメータとして「-」を使用してERBオブジェクトをインスタンス化する必要があります
ERB.new(template, nil, '-')
Willmcneilly、RobinBrouwer、fboの回答を組み合わせる必要がありました。
トリムモードを有効にする
ERB.new(File.read(filename), nil, '-')
-%>に変更します
<% $things.each do |thing| -%>
<object name="<%= thing.name %>">
<type><%= thing.name %></type>
</object>
<% end -%>
そして最後に、DOSからUNIXに変換します。私はVimで以下を使用しました:
:set fileformat=unix
:w
これを試して:
Name: <%= @user.name %>
<% unless @user.phone.blank? -%>Phone: <%= @user.phone %><% end -%>
Address: <%= @user.address %>
また、これが機能するかどうかわからない:
Name: <%= @user.name %>
<%= "Phone: #{@user.phone}" if @user.phone.present? -%>
Address: <%= @user.address %>
それも機能しない場合は、これでうまくいくはずです。
Name: <%= @user.name %><%= "\nPhone: #{@user.phone}" if @user.phone.present? %>
Address: <%= @user.address %>
最新のRails docs( http://guides.rubyonrails.org/v2.3.8/configuring.html#configuring-action-view )によると:
ActionView :: TemplateHandlers :: ERB.erb_trim_modeは、ERBが使用するトリムモードを提供します。デフォルトは「-」です。
それらはERBドキュメントを参照します( http://www.Ruby-doc.org/stdlib-2.0.0/libdoc/erb/rdoc/ERB.html#method-c-new )
If trim_mode is passed a String containing one or more of the following modifiers, ERB will adjust its code generation as listed:
% enables Ruby code processing for lines beginning with %
<> omit newline for lines starting with <% and ending in %>
> omit newline for lines ending in %>
- omit blank lines ending in -%>
したがって、必要なのは、-%>
のような終了erbタグにダッシュを入れることだけです。予期しない結果が発生した場合は、トリムモードで遊ぶ必要があるかもしれません。
同じ問題が発生しました。%>
の後のスペース文字が原因でした。
'>'オプションを使用すると、%>で終わる行の改行を省略できます。
ERB.new(template, nil, '>')
つまり、通常どおり、Rubyコードを<%%>タグ内にラップできます。残念ながら、開始<%タグの前のスペースを削除する方法が見つかりませんでした。