2011-06-09 42 views
1

我現在有這許多的gsubs長串的一個:如果gsub的替換值爲null,我該如何設置默認值?

gsub("{Company}", contact.company_name.clear_company.to_s). 

但有時contact.company_name爲空。

所以我從一長串這樣的事情發生了:

subject.gsub("{Company}", contact.company_name.clear_company.to_s) unless contact.company_name.blank? 

但這看起來醜陋和繁瑣。因爲這裏是整個字符串的樣子,每一個都可能是潛在的零這將引發錯誤:

12  sub_message = 
13  message.gsub("{FirstName}", contact.first_name). 
14   gsub("{LastName}", contact.last_name). 
15   gsub("{Title}", contact.title || "blank"). 
16  # gsub("{Company}", contact.company_name.clear_company). 
17   gsub("{Colleagues}", colleagues.to_sentence). 
18   gsub("{NextWeek}", next_week.strftime("%A, %B %d")). 
19   gsub("{FollowingWeek}", (Date.today + 14.days).strftime("%A, %B %d")). 
20   gsub("{UserFirstName}", contact.user.first_name). 
21   gsub("{UserLastName}", contact.user.last_name). 
22   gsub("{City}", contact.address.city.titleize || "default city"). 
23   gsub("{State}", contact.address.state || "default state"). 
24   gsub("{Zip}", contact.address.zip || "default zip"). 
25   gsub("{Street1}", contact.address.street1.titleize || "default street"). 
26   gsub("{Today}", (Date.today).strftime("%A, %B %d")). 
27   gsub("{CustomField1}", contact.custom_field_1.to_s). 
28   gsub("{PageBreak}", "p{page-break-after: always}. ") 

我想這樣做

gsub("{Company}", contact.company_name.clear_company.to_s || ""). 

但事實並非如此似乎工作。想法?

回答

0

我保留我的其他答案,因爲這是1.9.2的簡單答案。

在你的情況下,我會將替換方法與替換方法分開,您可以將它放在助手中以保持視圖清潔。

的替代可以在哈希設置:

replacements = { 
    "{Company}" => contact.company_name.clear_company || "", 
    "{FirstName}" => contact.first_name, 
    "{LastName}" => contact.last_name, 
    "{Title}" => contact.title || "blank", 
} 

然後輔助方法會是這個樣子:

def replace(string, replacements = {}) 
    replacements.each do |k,v| 
    string.gsub!(k,v) 
    end 
    string 
end 

,並使用它,你只希望做到以下幾點:

<%= replace("message", replacements) %> 

這種策略的另一個優點是,當你升級到1.9.2時,替換者ts接近字符串模板功能可以使用的表單。

如果您的需求比您發佈的任何更復雜,我會考慮使用liquid模板引擎來處理您的替換。

0

這是行不通的原因是因爲你將它轉換爲字符串。即使它是零,你基本上然後調用nil.to_s這將返回""(一個空字符串)和||運算符變得無用。

ruby-1.9.2-p136 :004 > "" || 1 
=> "" 
ruby-1.9.2-p136 :005 > nil.to_s || 1 
=> "" 

現在當然,如果您的默認值取代它正好是一個空字符串,然後這應該工作的罰款。

我會寫一個函數作爲你的gsub調用中的第二個參數。

def d(s) 
    s.blank? ? $DEFAULT : s 
end 

# Call it like this, 
$DEFAULT = "default_sub" 
gsub("{Company}", d contact.company_name.clear_company) 
3

最簡潔的方法是使用Ruby 1.9.2的字符串模板功能,並且可以完全避免使用gsub。

"%{company}" % {:company => contact.company_name.clear_company || ""} 
+0

怎麼發出googling'「字符串模板」ruby 1.9.2「沒有提供關於此功能的幫助文檔。它看起來很有用。 – 2011-06-09 04:25:26

+0

@Jeremy,[%方法上的文檔](http:// ruby​​-doc。org/core/classes/String.html#M001127)提及該功能。 – 2011-06-09 11:25:53

+0

非常感謝Mark! – 2011-06-09 15:15:19

相關問題