ruby ERB сравнить даты

У меня есть сайт, который использует файлы ruby ​​(rhtml), которые я не привык редактировать (больше привык к php). У меня есть доступ только к этим файлам для редактирования (так что не к серверной части).

В базе данных у меня есть дата, которую я могу отобразить, используя:

<%= zp.date %>

который будет отображать, например. 10.14.2010

Я могу отобразить сегодняшнюю дату, используя:

<%= Date.today.strftime("%Y%m%d") %>

который будет отображать 20160122.

Я пытаюсь понять, как я могу сравнивать даты и повторять разницу и, в свою очередь, отображать что-то другое.

e.g.

compare <%= zp.date %> and <%= Date.today.strftime("%Y%m%d") %>. 
If days difference is less than 20 echo XXX 
else 
If days difference between 20 - 40 echo XXX 
else
If days difference between 41 - 60 echo XXX 

Будем признательны за любую помощь (ссылки и т. д.), примеры кода будут очень признательны.

Еще раз, чтобы уточнить, я могу редактировать только rhtml.


person Phil    schedule 22.01.2016    source источник


Ответы (1)


Даты напрямую сопоставимы с операторами if, и вычисление разницы покажет вам количество дней между ними. Предполагая, что zp.date в прошлом:

<% date_difference = Date.today - zp.date %>
<% if date_difference < 20 %>
    ...
<% elsif date_difference <= 40 %>
    ...
<% elsif date_difference <= 60 %>
    ...
<% else %>
    Difference is greater than 60
<% end %>

Обратите внимание на теги <% %>, которые используются для логики if и внутреннего кода Ruby — практически любое выражение, которое не должно выводиться (спасибо @QPaysTaxes), вместо тега <%= %>, который является выходным тегом.

Если вы не знаете, находится ли zp.date в прошлом или будущем, вы можете использовать метод abs для результата:

<% date_difference = (Date.today - zp.date).abs %>

И если zp.date на самом деле не является Date объектом, то parse это:

<% date_difference = (Date.today - Date.parse(zp.date)).abs %>

Для более старых версий Ruby потребуется strptime< /a>, когда строка даты неоднозначна:

<% date_difference = (Date.today - Date.strptime(zp.date, '%d/%m/%Y')).abs %>
person sjagr    schedule 22.01.2016
comment
Привет, спасибо за вашу помощь, я попробовал все вышеперечисленное, но, к сожалению, я получаю ошибку 500 (`-': ожидаемое число или дата). Может ли это быть связано с тем, что форматы разные? например 10.14.2010 по сравнению с Date.today 22 января 2016 г. Есть ли способ изменить 14/10/2010 на 2010-10-14? - person Phil; 22.01.2016
comment
В качестве примечания, было бы более правильно (и слишком педантично, чтобы его можно было исправить) сказать, что <% используется для любого выражения, результат которого не должен выводиться. - person Fund Monica's Lawsuit; 22.01.2016
comment
@Phil Если оба хранятся как объекты Date, это не имеет значения. Однако убедитесь, что вы делаете из них Date объектов — это не работает со строками. - person Fund Monica's Lawsuit; 22.01.2016
comment
Как мне убедиться, что вы делаете из них объекты Date, извините, совершенно новые для ruby. - person Phil; 22.01.2016
comment
@Phil Подпишитесь на мою последнюю правку. Вероятно, вам нужно разобрать его с помощью Date.parse. Формат косой черты, такой как 14/10/2010, довольно неоднозначен, хотя (например, 02/01/2010), посмотрите, можете ли вы получить лучшее значение, например 2010-10-14. - person sjagr; 22.01.2016
comment
К сожалению, до сих пор есть ошибки. Просто чтобы я мог проверить, как мне просто проанализировать ‹%= zp.date %› самостоятельно, чтобы он отображался как 2010-10-14? Надеясь, что я смогу проверить и решить, что вызывает проблему. Еще раз спасибо за вашу помощь здесь. - person Phil; 22.01.2016
comment
@Фил <%= Date.parse(zp.date).strftime('%Y-%m-%d') %> - person sjagr; 22.01.2016
comment
Еще раз спасибо за вашу помощь. К сожалению, ‹%= Date.parse(zp.date).strftime('%Y-%m-%d') %› 500 ошибок с: ruby/1.8/date.rb:956:in new_by_frags': invalid date (ArgumentError): and lib/ruby/1.8/date.rb:1000:in parse': - person Phil; 22.01.2016
comment
@Phil Время проверить это. <%= zp.date.inspect %> - person sjagr; 22.01.2016
comment
‹%= zp.date.inspect %› отображает 14/10/2010 - person Phil; 22.01.2016
comment
@Phil Смотрите мое редактирование. Обязательно сообщите кому-нибудь, что их версии Rails и Ruby кажутся очень устаревшими. - person sjagr; 22.01.2016
comment
Вы, сэр... бог! Преклоняюсь перед твоим рубиновым мастерством! :) Еще раз спасибо за вашу помощь. - person Phil; 22.01.2016
comment
@Фил Рад помочь! Если мое решение решило вашу проблему, обязательно отметьте мой ответ как принятый. Это серая галочка под стрелками вверх и вниз рядом с моим ответом. Ваше здоровье! - person sjagr; 22.01.2016