来自URL参数的导轨时区



我正在尝试允许非签名的用户更改一天中的显示时间,并且似乎最好的方法是通过URL中的参数。我有:

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'

但是,它无法处理一些更复杂的(例如,"东部时间(我们&amp;加拿大)"),加上在地址栏中看起来很糟糕。

有没有一种方法可以简单地使用DST使用UTC偏移量(或任何其他缩写形式,例如'pdt')?

我解决了解决方案,希望其他人可能会发现它有用。

我创建了一个助手来基于前2个时区名称的前2个字母生成密钥/值对:

# 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

然后,我可以将这些缩写传递到Via参数中,然后在控制器中捡起它:

# 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 %>

给出了每种情况的链接,可以根据需要使用。

相关内容

  • 没有找到相关文章

最新更新