【问题标题】:How can I have a default in case the substituted value for gsub is null?如果 gsub 的替换值为空,我该如何设置默认值?
【发布时间】:2011-06-09 01:29:46
【问题描述】:

我目前将它作为一长串 gsub 中的一个:

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?

但这看起来又丑又麻烦。因为这是整个字符串的样子,所以每个字符串都可能是 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 || "").

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

【问题讨论】:

    标签: ruby-on-rails ruby gsub


    【解决方案1】:

    最简洁的方法是使用 Ruby 1.9.2 的字符串模板功能,您可以完全避免使用 gsub。

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

    【讨论】:

    • 谷歌搜索'"string templating" ruby​​ 1.9.2' 怎么没有显示任何关于此功能的帮助文档。看起来很有用。
    • @Jeremy,docs on the % method 提到了这个功能。
    • 我还在使用 Ruby 1.8.7 ...我有什么选择?
    • @Angela,您仍然可以像这样使用有序参数:"Company: %s" % [contact.company_name]
    • @MarkThomas,我更新了我的问题,我想我在弄清楚该怎么做时遇到了一些麻烦......谢谢......我正在尝试弄清楚如何处理 nils串在一起的gsub...
    【解决方案2】:

    我保留我的另一个答案,因为它是 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 模板引擎来处理您的替换。

    【讨论】:

      【解决方案3】:

      这不起作用的原因是因为您将其转换为字符串。即使它是 nil,您实际上也是在调用 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)
      

      【讨论】:

        猜你喜欢
        • 2017-03-26
        • 1970-01-01
        • 2021-01-15
        • 1970-01-01
        • 2014-05-14
        • 2016-01-02
        • 2021-11-08
        • 2013-03-23
        • 2021-01-26
        相关资源
        最近更新 更多