我目前将其作为众多gsubs中的众多之一:
gsub("{Company}", contact.company_name.clear_company.to_s).
但有时contact.company_name为null。
所以我从长字符串中突然出现了这样的事情:
subject.gsub("{Company}", contact.company_name.clear_company.to_s) unless contact.company_name.blank?
但这看起来很丑陋而且很麻烦。因为这是整个字符串的样子,每个字符串都可能是nil,这会引发错误:
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 :(得分:3)
最干净的方法是使用Ruby 1.9.2的字符串模板功能,你可以完全避免使用gsub。
"%{company}" % {:company => contact.company_name.clear_company || ""}
答案 1 :(得分:0)
这不起作用的原因是因为你将它转换为String。即使它是零,你基本上是调用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)
答案 2 :(得分: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时,替换将接近字符串模板功能可以使用的形式。
如果您的需求比您发布的内容更复杂,我会考虑使用liquid模板引擎来处理您的替换。