web-dev-qa-db-ja.com

末尾の行を削除するERBテンプレート

メールを送信するためのERBテンプレートがあります。

Name: <%= @user.name %>
<% if @user.phone.present? %>
Phone: <%= @user.phone %>
<% end %>
Address: <%= @user.address %>

Nameが空のときに、AddressPhoneの間の空白行を削除しようとしています。

返された結果

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ビューテンプレートで<%--%>を動作させることができたかどうかを知りたいです。

23
Harish Shetty

トリムモードを有効にするには、3番目のパラメータとして「-」を使用してERBオブジェクトをインスタンス化する必要があります

ERB.new(template, nil, '-')
26
willmcneilly

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
14
Scymex

これを試して:

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 %>
5
RobinBrouwer

最新の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タグにダッシュを入れることだけです。予期しない結果が発生した場合は、トリムモードで遊ぶ必要があるかもしれません。

5
codenamev

同じ問題が発生しました。%>の後のスペース文字が原因でした。

4
fbo

'>'オプションを使用すると、%>で終わる行の改行を省略できます。

ERB.new(template, nil, '>')

つまり、通常どおり、Rubyコードを<%%>タグ内にラップできます。残念ながら、開始<%タグの前のスペースを削除する方法が見つかりませんでした。

3
Sebastian