模型有两个属性:TravelReport
和departure_date
helperarrival_date
生成以下字符串:
'February - July 2014'
'December 2013 - January 2014'
'March 2014'
''
取决于开始和结束月份是否在同一年中。更糟糕的是,两者都可以为零,这将导致空字符串。
这是当前的方法:
def arrival_and_departure_months(travel_report)
if travel_report.arrival_date && travel_report.departure_date
output = I18n.l travel_report.arrival_date, :format => '%B'
if travel_report.arrival_date.year != travel_report.departure_date.year
output += I18n.l travel_report.arrival_date, :format => ' %Y'
else
if travel_report.arrival_date.month == travel_report.departure_date.month
return I18n.l(travel_report.departure_date, :format => '%B %Y')
end
end
output + I18n.l(travel_report.departure_date, :format => ' - %B %Y')
else
''
end
end
如何简化或优化代码?这个
arrival_and_departure_months(travel_report)
和if
的集合一点也不吸引眼球。 最佳答案
通过使用正则表达式替换字符串中不需要的部分,可以去掉一些if条件并获得更干净的代码:
def arrival_and_departure_months(travel_report)
if travel_report.arrival_date && travel_report.departure_date
output = I18n.l(travel_report.arrival_date, :format => '%B %Y') +
I18n.l(travel_report.departure_date, :format => ' - %B %Y')
output = output.gsub(/([^ ]+ \d{4}) - \1/, '\1')
output.gsub(/([^ ]+) (\d{4}) - ([^ ]+) \2/, '\1 - \3 \2')
else
''
end
end
您可以在此处检查和播放正则表达式:
http://rubular.com/r/mY3SiN7N14
http://rubular.com/r/1p5P5BUCVs