【问题标题】:Save an integer with time_zone_select使用 time_zone_select 保存一个整数
【发布时间】:2012-12-04 18:51:26
【问题描述】:

我正在关注此处找到的时区的 railscast-http://railscasts.com/episodes/106-time-zones-revised

以下是我用于时区选择输入的内容。目前,表单在数据库中保存一个字符串值(即“阿拉斯加”)。相反,我想将 UTC 偏移量保存为整数。我该怎么做呢?

<%= f.time_zone_select :time_zone, ActiveSupport::TimeZone.us_zones

【问题讨论】:

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


    【解决方案1】:

    您有两个选择,可以使用 select 或创建虚拟属性。我可能更喜欢后一种选择。

    由于 TimeZone 不会直接以小时为单位(仅以秒为单位或作为字符串)为您提供偏移量,因此您不能直接使用 collection_select,但可以像这样使用 select(utc_offset 以秒为单位):

    f.select :time_zone, ActiveSupport::TimeZone.us_zones.map { |z| [z.name, z.utc_offset / 1.hour] }
    

    如果您使用虚拟属性,请使用您已经在使用的代码,但使用 :time_zone_name 而不是 :time_zone,然后像这样更新您的模型:

    def time_zone_name=(value)
      time_zone = ActiveSupport::TimeZone.new(value).utc_offset / 1.hour
    end
    
    def time_zone_name
      # time_zone is a number like -9
      ActiveSupport::TimeZone.new(time_zone).name
    end
    

    我更喜欢最后一个选项,因为它使您可以通过偏移量或名称设置时区,甚至可以从 rails 控制台或您希望设置的任何地方。

    【讨论】:

    • 时区与偏移量不是一一对应的。
    • 他想在数据库中保存 UTC 偏移量。他希望用户选择时区。还是您没有阅读问题?
    • 小心,世界上有些地方需要 3.5 小时(加拿大某地)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-30
    • 2013-03-06
    相关资源
    最近更新 更多