3

次のようなフォームがあります

= form.datetime_select :due_at
= form.time_zone_select :time_zone, ActiveSupport::TimeZone.us_zones

このオブジェクトを保存するときに、選択したタイム ゾーンを適用する必要があります。たとえば、ユーザーが「03-01-2013 11:00」と「Central Time (US & Canada)」を選択した場合、日付/時刻が必要です。この場合、11AM は、アプリケーションのデフォルトのタイムゾーンではなく、11AM CST になります。 「太平洋時間(米国およびカナダ)」の。

これは実際には別のフォーム内にネストされているため、単に around_filter を使用してコントローラーの Time.zone を変更することはできません。私たちは、夏時間にも機能する解決策を見つけようとしています。

4

1 に答える 1

3

due_atとが両方とも 1 つのモデルの属性である場合time_zone、 before_save フックを使用して、 がデータベースに格納される前にdue_atのタイム ゾーンでエンコードされていることを確認できます。time_zone

class YourModel < ActiveRecord::Base
  before_save :apply_time_zone

  protected

  def apply_time_zone
    self.due_at = ActiveSupport::TimeZone[time_zone].parse "#{due_at_start.to_s(:db)} UTC"
  end
end

ActiveSupport::TimeZone[t].parse(s)stime zonetに解析し.to_s(:db)、時間を UTC の文字列に変換します。

于 2013-03-02T05:23:35.617 に答える