ruby on rails-如果gsub的替换值为null,我怎么能有默认值呢



我目前将其作为一长串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?

但这看起来既丑陋又笨重。因为这是整个字符串的样子,每个字符串都可能为零,这将引发错误:

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 || "").

但它似乎不起作用。想法?

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

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

我保留了我的另一个答案,因为这是1.9.2的一个简单答案。

在您的情况下,我会将替换与替换方法分开,您可以将其放在助手中以保持视图的整洁。

可以在散列中设置替换:

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

然后helper方法看起来像这样:

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

要使用它,您只需执行以下操作:

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

此策略的另一个优点是,当您升级到1.9.2时,替换项接近字符串模板功能可以使用的表单。

如果你的需求比你发布的更复杂,我会考虑使用液体模板引擎来处理你的替代品。

这不起作用的原因是因为您将它强制转换为字符串。即使它为零,您本质上也是在调用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)

相关内容

  • 没有找到相关文章

最新更新