【问题标题】:What's the best way to avoid losing time zones in Rails views?避免在 Rails 视图中丢失时区的最佳方法是什么?
【发布时间】:2011-05-10 14:57:08
【问题描述】:

我有一个带有namestart_timeend_time 字段的Event 模型的编辑视图。我的视图是一个大致如下的表格:

# ...
# 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 附加了一个时区,但是当我们渲染视图时该时间丢失了,因为 datetime_select 不包含时区字段。结果是我们有一个“UTC 时间”,它实际上是除去其时区的本地时间。

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

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,即使我们没有进行任何更改。这是一个严重的错误。

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

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3 timezone


    【解决方案1】:

    它从来都不是很令人满意,但我通常通过为名为 local_time 或 time_formatted 或类似的虚拟属性创建几个新方法来处理这个问题,它们从存储在 db 中的 UTC 时间来回转换.

    在本例中,db 字段为“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_formatted= 方法,它只是将结果传递给deadline=,所以你会认为结果是相同的。但是,不知何故,时间从 UTC(数据库)到本地时间(表格)来回转换。

    【讨论】:

    • 我最终采取了一种不同的方法,但在答案中这是最接近我的实际解决方案的,因此我将其标记为已接受。
    【解决方案2】:

    您可以尝试使用 delocalize gem:https://github.com/clemens/delocalize

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-23
      • 2011-01-12
      • 2014-12-15
      • 2010-09-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多