我正在尝试允许非登录用户更改时间显示,似乎最好的方法是通过URL中的params。我有:
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'这样的东西很有用。
然而,它无法处理一些更复杂的问题(例如“东部时间(美国和加拿大)”),加上地址栏中看起来很糟糕。
有没有办法简单地使用带有参数的DST(或任何其他缩写形式,如'PDT')的UTC偏移?
答案 0 :(得分:0)
我通过解决方法解决了这个问题,希望其他人可能会发现它很有用。
我创建了一个帮助器,根据时区名称的前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 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 %>
它提供了每个方案的链接,可以根据需要使用。