优化触发I18n.l日期格式化的条件

时间:2015-03-26 14:14:04

标签: ruby-on-rails ruby ruby-on-rails-4

模型TravelReport有两个属性:departure_datearrival_date

帮助器arrival_and_departure_months(travel_report)会产生以下字符串:

'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

我们如何简化或优化代码?这个ifelse的集合根本不是一件好事。

1 个答案:

答案 0 :(得分:2)

你可以通过使用正则表达式替换字符串中不需要的部分来摆脱一些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

您可以在这里检查并使用正则表达式: