1

タイムゾーンを設定するWebアプリがあります

post_controller.rb

before_filter :set_time_zone
def set_time_zone
  Time.zone = user.time_zone
end

さて、登録時にユーザーからtime_zoneを取得する代わりに、クライアント側から動的にtimezoneを設定し、before_filterで設定する方法を考えていました。私はdetect_timezone_railsgemを使おうとしていました。gemは、jsファイルからこのような関数を呼び出すだけで、クライアント側のタイムゾーンにアクセスする簡単な方法を提供します。

$(document).ready(function(){
    $('#your_input_id').set_timezone(); 
});

さて、上記のコードは自動的に隠しフィールド入力または選択入力を設定しますが、関数呼び出しを使用してセッションに保存し、Railsサーバーから取得できるかどうか疑問に思いました。ユーザーが最初にサイトにアクセスしたときに、タイムゾーンを設定し、セッション値を使用して残りのアクセスのタイムゾーンを設定できると思います。セッション値を使用して、beforeフィルターでタイムゾーンを設定することは可能だと思います。javascriptはかなり新しいので、Railの暗号化されたCookieストアにアクセスして値を設定する方法がわかりません。これは可能ですか?もしそうなら、どうすればこれを行うことができますか?前もって感謝します、

4

2 に答える 2

3
#javascript
function readCookieValue(cookieName)
{
  return (result = new RegExp('(?:^|; )' + encodeURIComponent(cookieName) + '=([^;]*)').exec(document.cookie)) ? decodeURIComponent(result[1]) : null;
}

$(document).ready(function(){

if(readCookieValue("time_zone") === null) {
  $.post('/set_time_zone',
       { 'offset_minutes':(-1 * (new Date()).getTimezoneOffset())});
}

#controller:
def set_time_zone
  offset_seconds = params[:offset_minutes].to_i * 60
  @time_zone     = ActiveSupport::TimeZone[offset_seconds]
  @time_zone     = ActiveSupport::TimeZone["UTC"] unless @time_zone
  if @time_zone
    cookies[:time_zone] = @time_zone.name if @time_zone
    render :text => "success"
  else
    render :text => "error"
  end
end
于 2013-01-15T16:09:24.063 に答える
1

これは多少異なる方法で行いました。gon JSからタイムゾーンを収集する場合は、 gemを使用してRails側で変数を設定します。次に、その変数を調べるクライアントにJSコードがあり、設定されている場合は、ISANタイムゾーンキーを返すjstimezonedetectスクリプトによって返されるタイムゾーン文字列を使用してエンドポイントにXHRポストを実行します(OPが行ったように) 。最後に、これをRails 3.2.19タイムゾーン名に変換するために、を実行しましたActiveSupport::TimeZone::MAPPING.invert[iana_key]。これを理解するのにいくつかのステップが必要でした。誰かに役立つことを願っています。

于 2015-10-22T21:46:53.140 に答える