我在Rails中使用此方法,并且在参数date_string
中传递时它会跳起来nil
。特别是当GetFileInfo -d
返回nil时。
Rails-y的处理方法是什么?
def calling_method
...
m = MyModel.create(creation_date: cdate_for(path))
...
end
def cdate_for(path)
local_datetime_for(`GetFileInfo -d "#{path}"`.chomp!)
end
def local_datetime_for(date_string)
t = Time.strptime(date_string, '%m/%d/%Y %H:%M:%S')
DateTime.parse(t.to_s)
end
可以从此返回nil,假设Model.create(creation_date: return_value_here)
可以处理nil值。
编辑添加了一些其他方法来说明调用链。
答案 0 :(得分:2)
您可以使用.blank?
:
def local_datetime_for(date_string)
return nil if date_string.blank?
t = Time.strptime(date_string, '%m/%d/%Y %H:%M:%S')
DateTime.parse(t.to_s)
end
.blank?
的一些用例:
1.9.3p448 :042 > false.blank?
=> true
1.9.3p448 :043 > true.blank?
=> false
1.9.3p448 :044 > [].blank?
=> true
1.9.3p448 :045 > ''.blank?
=> true
1.9.3p448 :046 > '1'.blank?
=> false
1.9.3p448 :047 > nil.blank?
=> true
(对于记录,.present?
与.blank?
)完全相反
答案 1 :(得分:1)
我认为习惯性的Ruby要求:
def local_datetime_for(date_string)
unless date_string.blank?
t = Time.strptime(date_string, '%m/%d/%Y %H:%M:%S')
DateTime.parse(t.to_s)
end
end
或者如果你想要花哨:
def local_datetime_for(date_string)
DateTime.parse(Time.strptime(date_string, '%m/%d/%Y %H:%M:%S').to_s) unless date_string.blank?
end
在方法的早期使用return
也非常Ruby。我很难习惯它来自Java背景,在那里我避免像瘟疫一样早期return
。
答案 2 :(得分:0)
您需要一个条件来检查date_string是否为nil。我会使用一个简单的If语句,
def local_datetime_for(date_string)
if date_string === nil
t = Time.strptime(date_string, '%m/%d/%Y %H:%M:%S')
t = DateTime.parse(t.to_s)
else
t = 'Unknown'
end
return t
end
答案 3 :(得分:0)
您可以立即检查date_string
值。立即返回是表达意图的最佳方式 - 并使用nil?
方法以Ruby-ish方式表达您正在寻找的内容:
def local_datetime_for(date_string)
return if date_string.nil?
t = Time.strptime(date_string, '%m/%d/%Y %H:%M:%S')
DateTime.parse(t.to_s)
end
在单个"保护条款中表达退货案例"这是一种很好的做法 - 尽可能快地将边缘情况排除在外,而不是让它们像一股难闻的气味一样徘徊,徘徊在方法的肉上。
答案 4 :(得分:0)
使用File.stat
而不是呼叫系统GetFileInfo
。然后使用Ruby中的stat
处理可能导致nil
结果的任何异常。
def cdate_for(path)
File.stat(path).ctime.to_datetime
end