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