2011-01-03 11 views
2

位置情報(通り、地方、郵便番号など)を含む私のモデルの検証をいくつか作成したいと思います。どの国が選択されているかに基づいてバリデーションルールを変更できるようにしたい。動的モデル検証

たとえば、米国&カナダでは、postal_codeの検証規則が異なります。さらに、いくつかの国ではpostal_codesがないため、検証ルールは必要ありません。

どうすればこのような実装を行うことができますか?

答えて

6

モデルにこれを入れ、検証のためのカスタムロジックを実行します。

validate :location_should_be_valid 

def location_should_be_valid 

    # run all your custom logic here 

    # if it isn't valid, add an error indicating why 
    if country == "Canada" 
    errors.add(:postal_code, "Invalid postal code for Canada") if postal_code.length != 7 
    end 
end 

Railsのガイドでは、このについて詳しく読む:
http://guides.rubyonrails.org/active_record_validations_callbacks.html#creating-custom-validation-methods

+0

私はlocation_should_be_validの中から自分のフォームの値にアクセスするにはどうすればよいですか? –

+0

これらはモデルの通常の変数に格納されます。これは、値が入力された後、値が保存される前に呼び出されます。私はこれの例を与えるために答えを修正しました。 – dontangg

1
validates :postal_code, :presence => true, :if => :check_country 

def check_country 
    ["US", "Canada"].include?(self.country) 
end 
+0

これはより適切なアプローチです –