Nasty Age Printing Method
Some notes:


(months -1) if today.day &lt; birth_date.day. Note that this is doing nothing, months - 1 is evaluated and dropped.
There is a age = in every branch of the conditional, and finally age is returned. That's unnecessary and not idiomatic, in Ruby conditionals are expressions, so we don't need to create a variable. 
About this:

age = "#{months} months" if years == 0
age = "1 year, #{months} months" if years == 1


It's preferable not to use in-line conditionals when you are dealing with assignments or expressions (it's ok if you are performing side-effects, i.e. fail("error") if x &lt; 0). In general follow functional programming guidelines, specially when dealing with logic (if you do some programming that does not deal with logic, please let me know ;-)). It should look (you could also use a case) something like this:

age = if years == 0
  "#{months} months"
elsif years == 1
  #{months} months" if years == 1
...
end



I'd write:

def age(birth_date)
  today = Time.zone.today
  total_months = (today.year*12 + today.month) - (birth_date.year*12 + birth_date.month)
  years, months = total_months.divmod(12)
  strings = [[years, "year"], [months, "month"]].map do |value, unit|
    value &gt; 0 ? [value, unit.pluralize(value)].join(" ") : nil
  end
  strings.compact.join(", ")
end


Note that, to keep it simple, this code (as yours) ignores the day of the month, which gives a slightly wrong answer.