Rails日期时间小时步骤

时间:2014-02-24 10:43:06

标签: ruby ruby-on-rails-4

我有一个应用程序,用户将从可用日期和时间列表中选择订单的交货日期。我每天有两个插槽(中午12:00和下午18:00),我希望选择日期时间字段中显示的日期始终比当前日期时间早24小时,并显示接下来3天的壁橱日期和时间。

即如果下单前的时间是下午17:00,则下一个可用时间应该是第二天下午18:00。

目前我有一个datetime类型的delivery_times列,在视图表单中有以下选项

    <%= f.datetime_select :delivery_time, 
               :default => 24.hours.from_now, 
               :minute_step => 30,
               :discard_year => true%>

是否可以添加开始时间,结束时间和使用除默认值以外的小时步骤?

由于

1 个答案:

答案 0 :(得分:1)

我认为这应该可以创建一个包含可用交付时间的列表:

# Determine the next available delivery time, 12:00 or 18:00
now = DateTime.now
next_hours = [12] * 12 + [18] * 6 + [12] * 6
next_start_hour = next_hours[now.hour]

# The offset in hours for each next entry in the list
offset_hours = if next_start_hour == 12
  [6, 24, 30, 48]
else
  [18, 24, 42, 48]
end

# Create an array of DateTime elements
first_option = now.change(hour: next_start_hour)
delivery_times = [first_option]
offset_hours.each do |offset|
  delivery_times << first_option + offset.hours
end

p delivery_times

未针对所有开始时间和时区/夏令时问题进行测试,可能会出现一些边缘情况......

您可以使用delivery_times数组为select或其堂兄options_for_select创建choices参数。

<%= f.select :delivery_time, delivery_times.collect {|dt| [ dt.to_s(:long), dt.to_s(:db) ] } %>

这应该使用可用的交货日期呈现选择。 select的to_s(:db)部分的id格式应该可以轻松地将它保存到数据库中(是吗?)。显示的值可以随意调整。

创建delivery_times数组的代码可以放在:

  1. 控制器。不太好,因为它不能在您的应用程序中的任何其他地方重复使用。
  2. 辅助方法。更好的想法,但现在您将业务逻辑放在视图助手中。
  3. Order模型中返回可用交付时间数组的方法。
  4. 您的app目录中存储业务逻辑的其他位置。