代码之家  ›  专栏  ›  技术社区  ›  Harish Shetty

Rails中是否有内置的默认值替换习惯用法支持?

  •  13
  • Harish Shetty  · 技术社区  · 14 年前

    我经常编写代码来在遇到nil/empty值时提供默认值。

    例如:

    category = order.category || "Any"
    #  OR
    category = order.category.empty? ? "Any" : order.category
    

    我要把 try 处理这个习语的方法。

    category = order.try(:category, :on_nill => "Any")
    #  OR
    category = order.try(:category, :on_empty=> "Any")
    

    我想知道Rails/Ruby是否有一些方法来处理这个习语?

    注:

    我正在努力消除 || / or / ? 基于操作员的习语。

    基本上我在寻找一个 尝试 处理默认替换方案的方法。

    没有 尝试 方法:

    product_id = user.orders.first.product_id unless user.orders.first.nil? 
    

    尝试 方法:

    product_id = user.orders.first.try(:product_id)
    

    很容易实现一个通用的方法来处理这个习语,但是我想确保我不会重新发明轮子。

    3 回复  |  直到 13 年前
        1
  •  16
  •   Community THelper    7 年前

    this question . ActiveSupport添加了 presence 方法返回其接收器的所有对象 present? (与…相反 blank? ) nil 否则。

    例子:

    host = config[:host].presence || 'localhost'
    
        2
  •  1
  •   Wayne Conrad    14 年前

    也许这可能有助于:

    class Object
      def subst_if(condition, replacement)
        condition = send(condition) if condition.respond_to?(:to_sym)
        if condition
          replacement
        else  
          self
        end
      end
    end
    

    像这样使用:

    p ''.subst_if(:empty?, 'empty')       # => "empty"
    p 'foo'.subst_if(:empty?, 'empty')    # => "foo"
    

    它还需要独立的条件,与对象无关:

    p 'foo'.subst_if(false, 'bar')    # => 'foo'
    p 'bar'.subst_if(true,  'bar')    # => 'bar'
    

    我不喜欢这个名字 subst_if . 如果我知道这个函数(假设它存在),我会借用Lisp对它使用的任何名称。

        3
  •  0
  •   Community THelper    7 年前

    很肯定它没有烤熟。这里有一个链接指向 similar question/answer . 这就是我所采取的方法。利用Ruby: ||= 句法

    旁白: 这个问题也让我想起了有史以来第一批铁路公司: Caching with instance variables 如果需要在控制器中执行这种操作,这是一个有用的屏幕显示