Ruby on rails Ruby:返回值还是nil

Ruby on rails Ruby:返回值还是nil,ruby-on-rails,ruby,return-value,null,Ruby On Rails,Ruby,Return Value,Null,我在Rails中有这个方法,当传入参数date\u 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!

我在Rails中有这个方法,当传入参数
date\u 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
假设
Model.create(creation\u date:return\u value\u此处)
可以处理nil值,则可以从此处返回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

我认为惯用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
也是非常有用的。我只是很难适应来自Java的背景,在那里我避免了早期的
返回
s,就像瘟疫一样。

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

.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
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?
正好相反)

您可以立即检查
日期字符串值。立即返回是表达您的意图的最佳方式–并使用
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
在一个“guard子句”中表示返回案例是一种很好的做法——它可以尽快消除边缘案例的影响,而不是让它们像臭味一样挂在方法的肉上。

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

def cdate_for(path)
  File.stat(path).ctime.to_datetime
end

添加了一些其他方法来说明调用链。尽量避免在
if
语句中包装内容。感觉不是很“Rails-y”。。。“也许我想得太多了……”Yoshiji先生用return nil if的回答看起来可能有点“红润”。此外,我知道上面的代码只是一个示例,但如果它是代码的副本,我建议包含“return”s