0

サインインしていないユーザーが時刻表示を変更できるようにしようとしていますが、URL のパラメーターを使用するのが最善の方法のようです。私は持っている:

class ApplicationController < ActionController::Base
  around_filter :use_time_zone

  private
    def use_time_zone(&block)
      Time.use_zone((params[:time] || Time.zone), &block)
    end
end

これは、「www.mysite.com?time=Hawaii」のようなものに最適です。

ただし、より複雑なもの (「東部標準時間 (米国およびカナダ)」など) の一部を処理できず、アドレス バーでの表示も悪くなります。

DST (または「PDT」のような他の省略形) で UTC オフセットを params で単純に使用する方法はありますか?

4

1 に答える 1

0

私はこれを回避策で解決しました。うまくいけば、他の人が役に立つかもしれません。

タイム ゾーン名の最初の 2 文字に基づいてキーと値のペアを生成するヘルパーを作成しました。

# helpers/application_helper.rb
(...)
def tz_mapping
  tzs = Hash.new
  ActiveSupport::TimeZone.us_zones.reverse.each do |tz|
    tzs[tz.name.to_s.first(2).downcase] = tz
  end
  tzs
end

次に、これらの略語を params 経由で渡し、コントローラーで取得できます。

# controllers/application_controller.rb
(...)
around_filter :use_time_zone

private

def use_time_zone(&block)
  zones = { 'ha' => 'Hawaii',
            'al' => 'Alaska',
            'pa' => 'Pacific Time (US & Canada)',
            'ar' => 'Arizona',
            'mo' => 'Mountain Time (US & Canada)',
            'ce' => 'Central Time (US & Canada)',
            'ea' => 'Eastern Time (US & Canada)',
            'in' => 'Indiana (East)' }

  Time.use_zone((zones[params[:tz]] || Time.zone), &block)
end

したがって、単純なビューは次のようになります

<% tz_mapping.each do |k,v| %>
  <%= link_to v, root_path + "?tz=#{k}" %><br />
<% end %>

各シナリオへのリンクがあり、必要に応じて使用できます。

于 2012-11-08T18:20:07.760 に答える