2012-11-07 47 views
0

我試圖讓未登錄的用戶更改一天中的時間顯示,並且它似乎最好的方法是通過參數中的參數。我有:來自URL的Rails時區參數

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」

但是,它不能處理一些更復雜的人的(例如,「美國東部時間的偉大工程(美國& Canada)'),加上這在地址欄中看起來很糟糕。

有沒有辦法簡單地使用DST(或任何其他縮寫形式如'PDT')帶參數的UTC偏移量?

+0

您是否嘗試過TimeZone.lookup方法? http://apidock.com/rails/v3.2.8/ActiveSupport/TimeZone/lookup/class – phoet

+0

這似乎只適用於全名,與上面的Time.use_zone一樣。我可以按照方法的建議做'tzinfo = ActiveSupport :: TimeZone.find_tzinfo('Hawaii')',然後'ActiveSupport :: TimeZone.create(tzinfo.name.freeze)',但是隻有在使用完全tz名。 – tyler

回答

0

我解決了這個解決方法,希望其他人可能會覺得它有用。

我創建了一個輔助以產生基於時區名稱的前兩個字母鍵/值對:

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

其中給出的鏈接EAC小時方案,並可根據需要使用。