我经常编写代码以在遇到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)
很容易实现处理这个习惯用法的通用方法,但我想确保不重新发明轮子。
答案 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