2009-06-03 41 views
14

我的頁面上的Javascript將客戶端UTC偏移量保存到cookie。 如何使用此cookie創建TimeZone並將其分配給Time.zone?在Rails中設置當前的Time.zone?

我需要這樣的東西:

before_filter :set_time_zone 

def set_time_zone 
    Time.zone = ActiveSupport::TimeZone.new('my timezone', cookies[:timezone]) 
end 

除了這個表達式的右邊部分不工作,我不知道如果我在這裏要以正確的方式。無法得到它。

回答

14

這裏的工作用Google搜索答案:

min = cookies[:timezone].to_i 
Time.zone = ActiveSupport::TimeZone[-min.minutes] 

只是要清楚,JavaScript部分:

if(!($.cookie('timezone'))) { 
    current_time = new Date(); 
    $.cookie('timezone', current_time.getTimezoneOffset(), { path: '/', expires: 10 }); 
} 
3

當我把它保存在我的用戶模型,所以也許你可以做

def set_time_zone 
    Time.zone = cookies[:timezone] 
end 

這是未經測試是因爲這

def set_time_zone 
    Time.zone = current_user.time_zone unless current_user.blank? 
end 

一樣簡單,我從來沒有試圖從做一個cookie,我認爲將它存儲在用戶模型中更有意義。

+0

不,我不需要將其存儲在用戶模型中。 無論如何,你的current_user.time_zone看起來像什麼?它是一個字符串? – snitko 2009-06-03 02:26:15

+1

是的,只是使用時區內建的Rails,所以對於我的用戶在應用程序中它只是「悉尼」 – nitecoder 2009-06-03 04:00:01

+0

通常,在模型(MVC的M部分)中訪問類似會話和cookie的對象不是一種好的做法 – yek 2011-05-01 21:40:35

6

@snitko - 你的答案對我來說很長一段時間偉大的工作。然而,正如@Giovanni指出的那樣,它在某些情況下沒有考慮夏令時,因爲它會在給定分鐘偏移量的情況下提供第一個可用時區。我找到了一個解釋DST的簡單工作答案。

這裏頭 - http://site.pageloom.com/automatic-timezone-detection-with-javascript,它是一個javascript時區檢測器。您只需將從網站鏈接的JavaScript代碼(或正確的here)複製到您應用程序的一個JavaScript文件(application.js工作正常)。它允許您通過名爲jstz的對象檢索時區。

然後,在application.html.erb我

<script type="text/javascript"> 

    var timezone = jstz.determine(); 
    document.cookie = 'time_zone='+timezone.name()+';'; 

</script> 

而在application_controller.rb,我有

before_filter :set_timezone 

private 
def set_timezone 
    Time.zone = cookies["time_zone"] 
end 

這就是你所需要的!時區已爲您的Rails應用程序正確設置。

編輯:這可能需要將javascript cookie設置代碼放在application.html.erb中的<\body>標籤後面,因爲JavaScript文件加載的方式和順序不同。

相關問題