在rails 4中的辅助方法中构建哈希或数组

时间:2015-03-24 15:02:00

标签: ruby-on-rails arrays ruby-on-rails-4 hash helper

我正在尝试使用帮助器方法构建一个哈希数组(我认为这是我用它的方式),以便我可以在我的视图中使用它。我从列@ other_events.time_start和@ other_events.time_end获取了2个值。

helper.rb

 def taken_times()
     @taken_times = []
    @other_events.each do |e|
    @taken_times << { e.time_start.strftime("%l:%M %P") => e.time_end.strftime("%l:%M %P")}
    end
    @taken_times
 end

我想要的是一系列像这样的哈希:

['10:00am', '10:15am'],
['1:00pm', '2:15pm'],
['5:00pm', '5:15pm'],

基本上是
[&#39; e.time_start&#39;,&#39; e.time_end&#39;],

2 个答案:

答案 0 :(得分:2)

我认为你应该重构你的方法:

def taken_times(other_events)
  other_events.map { |event| [event.time_start, event.time_end] }
end
  • 辅助方法不再设置全局变量@taken_times,但您可以轻松拨打@taken_times = taken_times(other_events)
  • 辅助方法正在使用它的参数other_events而不是全局变量@other_events,在某些视图中可能是nil
  • helper方法返回一个数组数组,而不是一个哈希数组。它是一个二维数组(“宽度”为2,长度为x,其中0 ≤ x < +infinity)。
  • helper方法返回包含DateTime对象的数组数组,而不是String。您可以轻松地操作DateTime对象,以便按照您希望的方式对其进行格式化。 “为什么不直接将DateTime转换为格式良好的字符串?”你会问,我会回答“因为你可以在视图中做到这一点,在最后一刻,也许有一天你会想要在呈现它之前在time_starttime_end之间进行一些计算

然后在你看来:

taken_times(@your_events).each do |taken_time|
  "starts at: #{taken_time.first.strftime("%l:%M %P")}"
  "ends at: #{taken_time.last.strftime("%l:%M %P")}"
end

答案 1 :(得分:0)

你要求一系列哈希([{},{},{},...]):

  Array: []
  Hash: {}

但是你期待一个数组数组([[],[],[] ...])

你应该这样做:

def taken_times()
    @taken_times = []
    @other_events.each do |e|
    @taken_times << [e.time_start.strftime("%l:%M %P"), e.time_end.strftime("%l:%M %P")]
    end
    @taken_times
end