我正在UTC中存储一个datetime字段,但是用户可以在不同的时区中输入它。我通过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) } %>我只是在测试“短”格式选项。我想我可以在以后再添加一个定制的。
我是否需要用嵌套属性格式化控制器中的时间?或者,我可以在处理时间存储的模型中格式化它们吗?如果你需要更多的信息或代码,请告诉我。
发布于 2014-08-04 05:54:13
我不确定这些是否是最好的选择,但我发现了两个:
1)将实例变量传递给具有字段值的分部。实例变量允许我使用to_s(:custom_format)格式化日期时间字段。
2)我使用的是简单的形式,发现使用它们的时间格式效果很好。例如:
<%= f.input :close, as: :time, ampm: true, minute_step: 15 %>
您可以将任何选择参数传递给简单的表单。
第二个选项将子午线选项(AM/PM)添加到hour字段,这对我来说有点奇怪。但这似乎是这两种方法中最简单的一种,所以我现在就同意了。

https://stackoverflow.com/questions/24884189
复制相似问题