Rails 4格式化部分日期时间字段

时间:2014-07-22 09:54:25

标签: datetime ruby-on-rails-4 timezone simple-form

我以UTC格式存储日期时间字段,但用户可以在各个时区输入。我通过JavaScript设置cookie来配置时区。这是我的ApplicationController代码:

before_filter :set_timezone

def set_timezone
  if !cookies["time_zone"].to_s.blank?
    Time.zone = cookies["time_zone"].to_s
  end
end

我在另一个控制器的表单上使用嵌套属性存储时间。这是通过simple_form和simple_fields_for渲染到字段的部分,以“f”形式传递:

<div class="row fieldset">
  <div class="col-sm-3">
    <%= f.input :day,  collection: days, selected: f.object.day %>
  </div>
  <div class="col-sm-3">
    <%= f.input :open, as: :string %>
  </div>
  <div class="col-sm-3">
    <%= f.input :close, as: :string %>
  </div>
  <div class="col-sm-3">
    <%= f.input :_destroy, as: :hidden %>
    <%= link_to "remove", '#', class: "remove_fields" %>
  </div>
</div>

时区转换工作正常。我可以在JavaScript检测到的时区中输入时间,然后它将以UTC格式存储它们。它还会在检测到的时区中显示它们,但会打印出完整格式:

2014-07-22 05:00:00 -0700

我相信字段在到达视图时是字符串,这就是为什么将输入字段的值设置为以下内容不起作用:

<%= f.input :close, as: :string, input_html: { value: f.object.close.to_s(:short) } %>

我只是测试'短'格式化选项。想象我稍后可以添加一个自定义的。

我是否需要使用嵌套属性格式化控制器中控制器的时间?或者我可以在处理存储时间的模型中格式化它们吗?如果您需要更多信息或代码,请与我们联系。

1 个答案:

答案 0 :(得分:1)

我不确定这些是不是最好的选择,但我发现这两个是:

1)将实例变量传递给具有fields值的partial。实例变量允许我使用to_s(:custom_format)格式化日期时间字段。

2)我正在使用Simple Form,发现使用他们的时间格式效果很好。例如:

<%= f.input :close, as: :time, ampm: true, minute_step: 15 %>

您可以将任何default datetime_select参数传递给Simple Form。

第二个选项将子午线选项(AM / PM)添加到小时字段,这对我来说有点奇怪。但它似乎是两者中最简单的解决方案,所以我现在就这样做了。

enter image description here