2

私がしようとすると:

validates_inclusion_of :time_zone, :in => TimeZone
validates_inclusion_of :time_zone, :in => Time.zone

次のエラーが表示されます。

"<class:User>": uninitialized constant User::TimeZone (NameError)

ユーザーが世界の任意のタイムゾーンを選択できるようにしようとしていますが、私はアメリカに拠点を置いているため、選択メニューは次のとおりです。

<%= f.time_zone_select :time_zone, ActiveSupport::TimeZone.us_zones, {:prompt => "Select Your Time Zone *"}, {:id => "timezone"} %>

これを行う正しい方法は何ですか?

ありがとうございました。

4

3 に答える 3

4

値のあるオプションを選択すると、"(GMT-05:00) Eastern Time (US & Canada)"この文字列が検証のためにモデルに渡されます。で渡すコレクションでのメソッドvalidates_inclusion_ofを実行します。Enum.include?:in

私の知る限りではどちらでもないため、true Timezone/ falseを返すインスタンスは返されません。Time.zoneEnumEnum.include?

選択が で構成されている場合ActiveSupport::TimeZone.us_zones、これは包含バリデータをチェックする必要があるものです

validates_inclusion_of :time_zone, :in => ActiveSupport::TimeZone.us_zones

しかし、ActiveSupport::TimeZone.us_zonesは文字列を返さないため、比較のために共通の型を取得する方法の 1 つは、上記Enumの の内容を文字列にキャストすることです。

validates_inclusion_of :time_zone, :in => ActiveSupport::TimeZone.us_zones.map(&:to_s)

これにより、次のようにコンソールで問題なく実行されるように、次のような選択された値"(GMT-05:00) Eastern Time (US & Canada)"が評価される必要があります。true

> ActiveSupport::TimeZone.us_zones.map(&:to_s).include?("(GMT-05:00) Eastern Time (US & Canada)")
=> true
于 2012-09-09T21:34:15.627 に答える