использование помощников для сокращения времени strftime в рельсах

Это моя первая попытка использовать помощников. Я хочу поместить относительно длинный метод, который я продолжаю повторно использовать в своих представлениях, в помощник.

Пример кода в представлении находится здесь:

<%= @guide.date_starting.strftime("%B #{@guide.date_starting.day.ordinalize}") %> to 
<%= @guide.date_ending.strftime("%B #{@guide.date_ending.day.ordinalize}") %>

Итак, что я пытался сделать, это написать это в помощнике модуля:

    def start_time_display
        self.strftime("%B #{@guide.date_starting.day.ordinalize}")
    end

    def end_time_display
        self.strftime("%B #{@guide.date_ending.day.ordinalize}")
    end

а потом написать это в представлениях

<%= @guide.date_starting.start_time_display %> to <%= @guide.date_ending.end_time_display %>

который дает мне эту ошибку:

undefined method `start_time_display' for Wed, 03 Sep 2014 00:00:00 UTC +00:00:Time

Итак, как мне этого добиться? Где я ошибаюсь? Как я мог написать это лучше? Правильно ли я обращаюсь к помощникам? Я ознакомился с документацией и, насколько я понимаю, для этого они и нужны.

РЕДАКТИРОВАТЬ:

поэтому я добавил ответ Дэмиена,

View.html.erb

помощник гида

def time_display(datetime)
  strftime("%B #{datetime.day.ordinalize}")
end


def time_display_span(start, end_date)
  time_display(start) + " to " + time_display(end_date)
end

ошибка...

undefined method `strftime' for #<#<Class:0x000001088c0128>:0x000001088cb168>

Обновление: Дэмиен был спасителем. Его ответ сработал и помог мне понять. Престижность

заранее спасибо


person rico_mac    schedule 06.07.2014    source источник
comment
@EgeErsoz Это был правильный помощник, я так много читал ..   -  person rico_mac    schedule 07.07.2014


Ответы (2)


Вы немного упустили фундаментальную концепцию.

@guide.date_starting.start_time_display

Приведенное выше вызывает метод start_time_display для date_starting, который является экземпляром DateTime. Так же, как date_starting является методом @guide.

Помощники представления похожи на глобальные функции, поэтому вы должны передать свой @guide.date_starting в качестве аргумента:

def time_display(datetime)
  datetime.strftime("%B #{datetime.day.ordinalize}")
end

def time_display_span(start_date, end_date)
  time_display(start_date) + " to " + time_display(end_date)
end

примечание: я использовал общий time_display, потому что вы можете передать date_starting/date_ending в качестве аргумента. Я также добавил time_display_span, который еще больше упростит ваши представления:

<%= time_display_span(@guide.date_starting, @guide.date_ending) %>
person Damien Roche    schedule 06.07.2014
comment
Гораздо лучший ответ. Удаление моего. - person Justin; 07.07.2014
comment
@DamienRoche хорошо, я думаю, я понял вас, но ваш метод выдает мне эту ошибку неожиданное keyword_end def time_display_span(start, end) ^ /Users/Fred/projects/artsmill/artsmill/app/helpers/guides_helper.rb:8: синтаксическая ошибка, неожиданное ключевое_окончание, ожидание ')' time_display(начало) + to + time_display(окончание) ^ - person rico_mac; 07.07.2014
comment
@rico_mac end — зарезервированное ключевое слово. Не поддавайтесь привычке копировать ответы;) вместо этого используйте end_date. Однако я обновлю свой ответ. - person Damien Roche; 07.07.2014
comment
Спасибо @DamienRoche, я знаю, один мудрый человек сказал мне, что однажды я должен слушать больше. Однако я адаптировал его и все еще пытаюсь увидеть ошибку, см. Обновление - person rico_mac; 07.07.2014
comment
@rico_mac Тогда я не слишком уверен. Не могли бы вы прислать полные определения этих методов (используйте pastie.org или что-то подобное)? Синтаксис в моем обновленном ответе должен быть в порядке. - person Damien Roche; 07.07.2014
comment
@rico_mac также, возможно, вы захотите изучить шаблон декоратора. Я бы не стал использовать его в этом случае, но он может быть отличной альтернативой помощникам представления для конкретной модели. github.com/drapergem/draper - person Damien Roche; 07.07.2014
comment
@DamienRoche, классный парень. Ну вот. кстати спасибо за помощь. pastie.org/9362160 - person rico_mac; 07.07.2014
comment
@rico_mac по-прежнему выдает ту же ошибку, что и выше? Может быть, я слишком устал, но синтаксис выглядит нормально. - person Damien Roche; 07.07.2014
comment
@DamienRoche да, это так. если strftime является неопределенным методом, означает ли это, что я вызываю его для чего-то другого, кроме DateTime? - person rico_mac; 07.07.2014
comment
@rico_mac да, скорее всего. Это метод на DateTime: apidock.com/ruby/DateTime/strftime. В приведенном выше методе time_display его следует вызывать как datetime.strftime(...) - person Damien Roche; 07.07.2014
comment
Давайте продолжим обсуждение в чате. - person rico_mac; 07.07.2014
comment
@DamienRoche все еще не уверен. - person rico_mac; 07.07.2014
comment
@rico_mac К сожалению, я иду спать, поэтому не могу общаться. Я еще раз проверю это завтра и поговорю дальше, если вы не решили. Тем не менее, синтаксис выглядит нормально. Я обновил свой ответ, так что попробуйте. Поскольку метод довольно общий, его лучше поместить в ApplicationHelper, чем в GuidesHelper. - person Damien Roche; 07.07.2014
comment
@rico_mac приятно слышать! :) - person Damien Roche; 07.07.2014

Драгоценный камень штампа может делать то, что вы хотите.

https://github.com/jeremyw/stamp

person James Dunn    schedule 07.07.2014