次の包含検証に苦労しています。
class User < ActiveRecord::Base
attr_accessible :language
validates :language, :presence => true, :inclusion => { :in => I18n.available_locales.join(' ')}
end
これをコンソールで実行すると、
u = User.new
u.valid?
次にTypeError: can't convert nil into String
、のinclude?
メソッドでa を取得しactive_model/validations/inclusion.rb
ます。
ただし、検証行を次のように変更すると、
validates :language, :presence => true, :inclusion => { :in => %(en fr es)}
その後、検証は期待どおりに機能します。language が nil であるか、予想どおりリスト内のエントリの 1 つでない場合は無効であり、クラッシュはありません。
コードをステップ実行して、包含リストが正常に生成されていることを確認しました。では、なぜクラッシュするのでしょうか。プレゼンスの検証で問題が検出され、それ以上の検証が妨げられるべきではありませんか? また、値をハードコーディングするのではなく、リストを生成するとクラッシュするのはなぜですか?
proc 形式を使用して、:in
違いが生じるかどうかを確認してみましたが、違いはありませんでした。しかし、アプリの実行中に I18n.available_locales が変更されることはないため、アプリが読み込まれたときに一度だけリストを生成したいので、それが必要になるとは本当に思っていませんでした。
更新: アイデアがあり、次のコードをテストしました。
class User < ActiveRecord::Base
attr_accessible :language
validates :language, :presence => true, :inclusion => { :in => ['en','fr','es'].join(' ') }
end
このコードも同じエラーを生成するため、問題は I18n などにはありません。と の違いに関係してい%(en fr es)
ます['en','fr','es'].join(' ')
。