4

我在 Rails 中有这个方法,当传入参数时它会跳闸,date_string, is 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 值。

编辑:添加了一些其他方法来说明调用链。

4

5 回答 5

3

您可以使用.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?

于 2013-10-24T16:35:32.693 回答
1

使用File.stat而不是向系统调用GetFileInfo. stat然后使用Ruby 中的任何可能导致结果的异常处理nil

def cdate_for(path)
  File.stat(path).ctime.to_datetime
end
于 2014-07-11T09:16:38.937 回答
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的瘟疫。

于 2013-10-24T16:35:26.067 回答
0

您可以立即检查该date_string值。立即返回是表达您的意图的最佳方式 - 并使用该nil?方法以 Ruby 风格的方式表达您正在寻找的内容:

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

在单个“保护子句”中表达返回案例是一种很好的做法——它会尽快将边缘案例排除在外,而不是让它们像难闻的气味一样四处游荡,悬停在方法的核心上。

于 2013-10-24T16:44:38.100 回答
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
于 2013-10-24T16:31:11.337 回答