2011-05-10 88 views
3

我有Event模型的編輯視圖,其中name,start_timeend_time字段。我的看法是,看起來大致是這樣一種形式:避免在Rails視圖中丟失時區的最佳方法是什麼?

# ... 
# form with: 
# - event name 
# - datetime_select for event start_time (in business's local time zone) 
# - datetime_select for event end_time (in business's local time zone) 

現在,這裏的問題:start_timeend_time附加了一個時區,但是當我們渲染認爲浪費時間,因爲datetime_select不包括時區的字段。結果是我們有一個「UTC時間」,實際上它是剝離其時區的本地時間。

總括,情況是這樣的。當我們在視圖中的窗體,然後立即提交,而不做任何改變:

db time:     2011-05-15 @ 1100 UTC 
converted to local time: 2011-05-15 @ 0600 CDT 
time stored in view:  2011-05-15 @ 0600 UTC (time zone info lost) 
time posted back to db: 2011-05-15 @ 0600 UTC 

注意儲存的時間爲1100 UTC原本不過是現在0600 UTC,即使我們沒有做任何改變。這是一個嚴重的錯誤。

我們可以在這裏採取多種方法。發佈視圖時避免丟失時區的最明智的方法是什麼? (請注意,模型可能會以發佈表單之外的方式進行更新 - 例如通過API。)

回答

0

它從來沒有讓人感到非常滿意,但我通常通過爲虛擬屬性製作幾個新方法來處理此問題叫做local_time,或time_formatted或類似的東西,它可以從存儲在數據庫中的UTC時間來回轉換。

在這個例子中分貝字段爲「截止」,並且虛擬屬性是「deadline_formatted」:

def deadline_formatted 
    self.deadline 
end 

def deadline_formatted= s 
    self.deadline = s 
end 

然後,在形式,

<%= f.label :deadline_formatted, "Deadline" %> 
<%= f.text_field :deadline_formatted %> 

經由某一軌道魔法,我仍然不太明白*,這足以做到這一點 - 它看起來應該不起作用,但它確實如此。至少它爲我做了。

*我不明白的部分是,在表單中設置截止日期字段將繼續使用文本字段中的值調用截止日期=方法。相反,我調用deadline_formatted =方法,它只是將結果傳遞給deadline =,所以你會認爲結果是相同的。但是,不知何故,時間會從UTC(數據庫)到當地時間(表格)來回翻譯。

+0

彼時我採取的是不同的方法,但答案的,這是最接近我的實際解決方案,從而爲接受,我會記住這。 – 2011-07-30 16:53:33

相關問題