absolutskyy
absolutskyy

Reputation: 567

Using distance_of_time_in_words in Rails

I have a start month (3), start year (2004), and I have an end year (2008). I want to calculate the time in words between the start and end dates. This is what I'm trying and it's not working..

# first want to piece the start dates together to make an actual date
# I don't have a day, so I'm using 01, couldn't work around not using a day
st = (start_year + "/" + start_month + "/01").to_date
ed = (end_year + "/01/01").to_date

# the above gives me the date March 1st, 2004
# now I go about using the method 
distance_of_time_in_words(st, ed)

..this throws an error, "string can't me coerced into fixnum". Anyone seen this error?

Upvotes: 0

Views: 408

Answers (2)

KL-7
KL-7

Reputation: 47678

You can't just concatenate strings and numbers in Ruby. You should either convert numbers to strings as mliebelt suggested or use string interpolation like that:

st = "#{start_year}/#{start_month}/01".to_date

But for your particular case I think there is no need for strings at all. You can do it like that:

st = Date.new(start_year, start_month, 1)
ed = Date.new(end_year, 1, 1)
distance_of_time_in_words(st, ed)

or even like that:

st = Date.new(start_year, start_month)
ed = Date.new(end_year)
distance_of_time_in_words(st, ed)

See Date class docs for more information.

Upvotes: 1

mliebelt
mliebelt

Reputation: 15525

Given that the context in which you are calling the method is one that knows the methods from ActionView::Helpers::DateHelper, you should change the following:

# first want to piece the start dates together to make an actual date
# I don't have a day, so I'm using 01, couldn't work around not using a day
st = (start_year.to_s + "/" + start_month.to_s + "/01").to_date
ed = (end_year.to_s + "/01/01").to_date

# the above gives me the date March 1st, 2004
# now I go about using the method 
distance_of_time_in_words(st, ed)
=> "almost 3 years"

So I have added calls to to_s for the numbers, to ensure that the operation + is working. There may be more efficient ways to construct a date, but yours is sufficient.

Upvotes: 0

Related Questions