gpt4 book ai didi

ruby-on-rails - 避免在 Rails View 中丢失时区的最佳方法是什么?

转载 作者:数据小太阳 更新时间:2023-10-29 08:13:44 24 4
gpt4 key购买 nike

我有一个 Event 模型的编辑 View ,其中包含 namestart_timeend_time 字段。我的 View 是一个大致如下所示的表单:

# ...
# form with:
# - event name
# - datetime_select for event start_time (in business's local time zone)
# - datetime_select for event end_time (in business's local time zone)

现在,问题来了:start_timeend_time 附加了一个时区,但是当我们渲染 View 时那个时间丢失了,因为 datetime_select 没有'包括一个时区字段。结果是我们有一个“UTC 时间”,它实际上是去掉了时区的本地时间。

回顾一下,当我们在 View 中渲染表单时,情况看起来像这样,然后立即提交它而不做任何更改:

db time:                 2011-05-15 @ 1100 UTC
converted to local time: 2011-05-15 @ 0600 CDT
time stored in view: 2011-05-15 @ 0600 UTC (time zone info lost)
time posted back to db: 2011-05-15 @ 0600 UTC

请注意,存储的时间最初是 1100 UTC,但现在是 0600 UTC,尽管我们没有进行任何更改。这是一个严重的错误。

我们可以在这里采用多种方法。在发布到 View 时避免丢失时区的最聪明的方法是什么? (请注意,模型可能会以发布表单以外的方式进行更新——例如,通过 API。)

最佳答案

从来没有感觉非常令人满意,但我通常通过为名为 local_time 或 time_formatted 或类似的东西的虚拟属性创建几个新方法来处理这个问题,这些方法从存储在数据库中的 UTC 时间来回转换.

在这个例子中,数据库字段是“deadline”,虚拟属性是“deadline_formatted”:

def deadline_formatted
self.deadline
end

def deadline_formatted= s
self.deadline = s
end

然后,在表单中,

<%= f.label :deadline_formatted, "Deadline" %>
<%= f.text_field :deadline_formatted %>

通过一些我仍然不太明白的 rails 魔术*,这足以做到这一点 - 看起来它不应该起作用,但它确实起作用了。至少它对我有用。

*我不明白的部分是,在表单中设置截止日期字段将继续使用文本字段中的值调用 deadline= 方法。相反,我调用了 deadline_formatted= 方法,它只是将结果传递给 deadline=,因此您会认为结果是相同的。但是,不知何故,时间在 UTC(数据库)和本地时间(表单)之间来回转换。

关于ruby-on-rails - 避免在 Rails View 中丢失时区的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5952072/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com