2011-01-08 7 views
19

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

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

私はPhoneが空の場合NameAddressの間に空白行を削除しようとしています。

返される結果

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

ヘルパーメソッド:

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ビューテンプレートで作業させることができるかどうかを知ることに興味があります。

答えて

5

このお試しください:これが機能するかどうかわからない、また

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 %> 
+1

アプローチ1,2は動作しません。第3のアプローチのバリエーションは私が現在使っているものです。更新された質問を見てください。問題は、なぜ '<%--%> 'タグが機能しないのかについてです。 –

4

私は同じ問題を抱えていました。

それはたぶん、それはあなたがERBオブジェクトをインスタンス化する必要がトリムモードを有効にするには

にフランソワ

+0

これは、改行を失う1つの方法です。すべてのerb' if' | 'unless' [...]' end'文を1行に入れてください。私は時々これを行うが、メンテナンスのためにそれほど読みにくいものではない。 –

22

をお手伝いします%>

のaferスペース文字が原因だった「 - 」三番目のパラメータとして

ERB.new(template, nil, '-') 
最新のレールのドキュメントによると
+0

奇妙なことに、1.8や1.9のドキュメンテーションでは、 ' - 'オプションについて何も言われていません。それはコードの中にあります。誰かがこれを明確にすることはできますか? 1.8:http://ruby-doc.org/stdlib-1.8.7/libdoc/erb/rdoc/ERB.html#method-c-new 1.9:http://ruby-doc.org/stdlib- 1.9.3/libdoc/erb/rdoc/ERB.html#method-c-new ソース:http://ruby-doc.org/gems/docs/p/Pimki-1.8.200/ERB/Compiler.html# method-i-prepare_trim_mode – krukid

+2

@krukid:2.1は現在http://ruby-doc.org/stdlib-2.1.1/libdoc/erb/rdoc/ERB.htmlと言われていますが、その内容についてはあまり正確ではありません。関連する質問:http://stackoverflow.com/questions/3801550/what-does-mean-in-ruby-on-rails-compared-to/25613037 –

4

http://guides.rubyonrails.org/v2.3.8/configuring.html#configuring-action-view):

ActionView :: TemplateHandlers :: ERB.erb_trim_modeは、ERBで使用されるトリムモードを示します。デフォルトは ' - 'です。

彼らはとてもあなたがする必要がある必要があるすべては-%>のようなあなたのクロージング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 -%> 

を参照。予期しない結果が見られる場合は、トリムモードで再生する必要があります。

3

「>」オプションを使用すると、あなたが%で終わる行を改行を省略します>あなたはいつものように、<%の%>タグ内にRubyのコードをラップすることができることを意味し

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

。 残念ながら、<%タグの開始前に空白を削除する方法が見つかりませんでした。

8

私はwillmcneilly、RobinBrouwerとfboの回答を組み合わせなければなりませんでした。 %>

<% $things.each do |thing| -%> 
    <object name="<%= thing.name %>"> 
    <type><%= thing.name %></type> 
    </object> 
<% end -%> 

そして最後に、DOSからUNIXへの変換 -

はにトリムモード

ERB.new(File.read(filename), nil, '-') 

変更を有効にします。私はVimで以下を使用しました:

:set fileformat=unix 
:w 
関連する問題