2011-01-08 90 views
19

我有用於發送電子郵件的ERB模板。刪除拖尾行的ERB模板

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

我試圖刪除NameAddress之間的空行時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

現在我解決這個問題用紅寶石兩輪牛車工作。

helper方法:

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不起作用。第三種方法的變化是我目前正在使用的方法。看看我更新的問題。問題更多的是爲什麼`<%--%>`標籤不起作用。 – 2011-01-09 01:13:55

4

我有同樣的問題,

它空格字符是由於AFER %>

也許它會幫助你

弗朗索瓦

+0

是的,這是丟失換行符的一種方法 - 將所有的erb`if`|`除非`end`語句放在一行中。我有時會這樣做,但是對於維護來說它不是非常易讀。 – 2013-02-24 11:47:32

22

爲了使裝飾模式,你必須實例化與再培訓局的對象「 - 」作爲第三個參數

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 2013-01-09 17:38:49

4

根據最新的軌道文檔(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標籤的衝刺。如果您看到意外的結果,您可能需要使用修剪模式。

3

通過使用「>」選項,你會忽略換行符在結尾%行>

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

這意味着你可以用Ruby代碼裏面<%%>標籤,一如往常。 不幸的是,我還沒有找到一種方法來刪除啓動<%標記之前的空格。

8

我不得不將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