使用帮助器缩短rails中的strftime

时间:2014-07-06 22:39:58

标签: ruby-on-rails ruby view-helpers

这是我第一次尝试使用助手。我想提出一个相对较长的方法,我不断在我的视图中重用一个帮助器。

视图中的代码实例如下:

<%= @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

那么,我该如何实现呢?我哪里错了?我怎么能写得更好?我在这里以正确的方式接近帮手吗?我已经查阅了文档,我的理解就是它们的用途。

编辑:

所以我添加了Damien的答案,

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>

更新:Damien是救命稻草。他的回答是一种享受,帮助我理解。奖励

提前致谢

2 个答案:

答案 0 :(得分:3)

你略微错过了一个基本概念。

@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) %>

答案 1 :(得分:0)

邮票宝石可能会做你想要的。

https://github.com/jeremyw/stamp