轨从网址参数的时区(Rails time zone from URL params)

2019-10-30 09:07发布

我试图允许非注册用户使变更时间显示的时间,这似乎是最好的办法是通过在网址参数。 我有:

class ApplicationController < ActionController::Base
  around_filter :use_time_zone

  private
    def use_time_zone(&block)
      Time.use_zone((params[:time] || Time.zone), &block)
    end
end

这对于像“www.mysite.com?time=Hawaii”的伟大工程

但是,它不能处理一些较复杂的人(如“东部时间(美国和加拿大)”),再加上这看起来不错,在地址栏中。

有没有办法简单地使用UTC与DST(或其他任何缩写形式,如“PDT”)使用参数偏移?

Answer 1:

我解决了这个有一个解决办法,希望其他人可能会发现它很有用。

我创建了一个帮手,基于时区名称的前两个字母键/值对:

# helpers/application_helper.rb
(...)
def tz_mapping
  tzs = Hash.new
  ActiveSupport::TimeZone.us_zones.reverse.each do |tz|
    tzs[tz.name.to_s.first(2).downcase] = tz
  end
  tzs
end

然后,我可以经由PARAMS通过在这些缩写和把它捡起来在控制器:

# controllers/application_controller.rb
(...)
around_filter :use_time_zone

private

def use_time_zone(&block)
  zones = { 'ha' => 'Hawaii',
            'al' => 'Alaska',
            'pa' => 'Pacific Time (US & Canada)',
            'ar' => 'Arizona',
            'mo' => 'Mountain Time (US & Canada)',
            'ce' => 'Central Time (US & Canada)',
            'ea' => 'Eastern Time (US & Canada)',
            'in' => 'Indiana (East)' }

  Time.use_zone((zones[params[:tz]] || Time.zone), &block)
end

因此,一个简单的观点可能看起来像

<% tz_mapping.each do |k,v| %>
  <%= link_to v, root_path + "?tz=#{k}" %><br />
<% end %>

这给链接到每个场景,并可以根据需要使用。



文章来源: Rails time zone from URL params