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

时间:2010-09-02 22:26:23

标签: ruby-on-rails ruby

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

E.g:

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 / ?运算符的习语的重复。

基本上我正在寻找用于处理默认替换方案的等效try方法。

没有try方法:

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

使用try方法:

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

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

4 个答案:

答案 0 :(得分:16)

this question。如果present?(与blank?相反),ActiveSupport会向返回其接收者的所有对象添加presence方法,否则为nil

示例:

host = config[:host].presence || 'localhost'

答案 1 :(得分:1)

也许这可能有用:

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用于此功能的任何名称(假设它存在)。

答案 2 :(得分:0)

非常确定它没有被烘焙。这是similar question/answer的链接。这是我采取的方法。利用ruby:||=语法

旁白:这个问题也让我想起了有史以来的第一个Railscast:Caching with instance variables如果你需要在Controller中进行这种操作,这是一个有用的截屏视频

答案 3 :(得分:0)

fetch在您通过数组的index值或哈希中的keys(或ActionController::Parameters又名{{1 }})。否则,您将必须按照其他答案中的说明使用params||=

当前接受的答案的示例在此处重写:

假设:attempted_value || default_value

config = { my_host_ip: '0.0.0.0' }

 config.fetch(:my_host_ip, 'localhost')
 # => "0.0.0.0" 

 config.fetch(:host, 'localhost')
 # => "localhost"

注意:没有默认设置,当 a_thru_j = ('a'..'j').to_a # => ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"] a_thru_j.fetch(1, 'not here') # => "b" a_thru_j.fetch(10, 'not here') # => "not here" / key不存在时,您将引发错误:

index