30

TZInfo識別子として受け取ったjs値をRails TimeZoneの名前/キーに変換するにはどうすればよいですか?

FROM: "America/New_York"JavaScript TZinfo 検出から返される
TO: "Eastern Time (US & Canada)"Rails TimeZone で使用される規則


または別の例:
"Pacific/Honolulu"=> => に変換"Hawaii"

どちらもActiveSupport::TimeZone < Objectマッピングで使用できますが、Rails はキー [ig "Eastern Time (US & Canada)"] をドロップダウン、検証、およびへの保存に使用しTime.use_zone()ます。


私が理解していることに基づいて、ActiveSupport::TimeZone.us_zonesこれは特にDayLightsの節約時間(レールがうまく処理するように聞こえる)の場合に重要であり、オフセットだけを一致させることはできません。Rails TimeZone 名で DB に保存されていない場合、検証は失敗し、ユーザーのプロファイル設定ページでドロップダウン リストと適切に一致しません。ActiveSupport::TimeZone.zones_map

これの目的は、ユーザーがサインアップ時にタイムゾーンを選択する必要がないこと、またはサインアップ後に設定で変更する必要がないことです。ブラウザーはそれを検出し、サインアップ時に hidden_​​field に渡します。まれに、自宅や職場とは別の場所でサインアップすることがあります。後でアカウント設定で手動でオーバーライドできます。

js タイムゾーン検出を取り込もうとすると、一般的なギャップのようです。これは、返された情報を js から rails に渡して変換し、js に戻してフォームの hidden_​​field に保存する方法の二次的な問題になる可能性もあります。うまくいけば、私は質問を適切に組み立て、確かにレールで少し緑色になっているので、これに対する簡単な解決策があるかもしれません...

すべての助けをありがとう!
-E


ActiveSupport Time.zone ドキュメント
http://api.rubyonrails.org/classes/ActiveSupport/TimeZone.html#method-i-parse

MAPPING = {"Eastern Time (US & Canada)" => "America/New_York"


js パッケージ化された gem 'temporal-rails' を使用してユーザーのタイムゾーンを検出する:
https://github.com/jejacks0n/temporal

ユーザー Time_Zone の実装:
http://railscasts.com/episodes/106-time-zones-revised

*Devise & Devise-必然の使用


サインアップ ビュー スクリプト

    <script>
    $(function() {
        var detected_zone = Temporal.detect();
        console.log(detected_zone);  // returns object
        detected_zone = detected_zone.timezone.name;
        console.log(detected_zone);  // returns "America/New_York"
        $('#user_time_zone').val(detected_zone);  // ! need to convert this to rails TimeZone name !
    });
    </script>

ユーザーモデル

    validates_inclusion_of :time_zone, in: ActiveSupport::TimeZone.zones_map(&:name)

ユーザーアカウント設定フォーム

    <%= f.label :time_zone, label: "Time Zone" %><br />
    <%= f.time_zone_select :time_zone, ActiveSupport::TimeZone.us_zones %>
4

2 に答える 2

33

Temporal には必要なロジックが含まれていますが、質問に答えるには:

Time.zone = ActiveSupport::TimeZone.new("America/New_York")

編集、私の答えは不完全だと思います。"America/New_York" から "Eastern Time (US & Canada)" に変更したいですね。その場合、これが私が持っている最善の解決策ですが、誰かがより良い解決策を提供できるかもしれません。

ActiveSupport::TimeZone::MAPPING.select {|k, v| v == "America/New_York" }.keys.first

于 2013-01-08T23:55:15.197 に答える