2012-07-31 4 views
21

Rails 3'teki özel onaylama seçeneklerim ile biraz kafam karışmış durumda ve birisinin bana şu anki sorunumda yardımcı olabilecek bir kaynak yönünde yönlendirebileceğini umuyorum.Raylar 3 - Özel Doğrulama

Şu anda 3 model var, vehicle, trim ve model_year.

class Vehicle < ActiveRecord::Base 
    attr_accessible :make_id, :model_id, :trim_id, :model_year_id 
    belongs_to :trim 
    belongs_to :model_year 
end

class ModelYear < ActiveRecord::Base attr_accessible :value has_many :model_year_trims has_many :trims, :through => :model_year_trims end

class Trim < ActiveRecord::Base attr_accessible :value, :model_id has_many :vehicles has_many :model_year_trims has_many :model_years, :through => :model_year_trims end

Benim sorgu bu - Bir araç oluşturma, ben seçilmiş model_year Döşeme (ve tersi) için geçerli olduğundan emin olmak nasıl şöyledir: Onlar görünüyor? here açıklandığı gibi

cevap

56

Eğer özel doğrulama yöntemi kullanabilirsiniz:

class Vehicle < ActiveRecord::Base 
    validate :model_year_valid_for_trim 

    def model_year_valid_for_trim 
    if #some validation code for model year and trim 
     errors.add(:model_years, "some error") 
    end 
    end 

end 
24

Öyle gibi ActiveModel::Validator sınıfını kullanabilirsiniz:

class VehicleValidator < ActiveModel::Validator 
    def validate(record) 
    return true if # custom model_year and trip logic 
    record.errors[:base] << # error message 
    end 
end 

class Vehicle < ActiveRecord::Base 
    attr_accessible :make_id, :model_id, :trim_id, :model_year_id 
    belongs_to :trim 
    belongs_to :model_year 

    include ActiveModel::Validations 
    validates_with VehicleValidator 
end 
+4

Bu uzun vadede daha temiz. Bu kabul edilen cevap olmalı. – kgpdeveloper

+0

Özel doğrulayıcılarınızı nereye koymalısınız? Hangi dizin –

+0

Benimkini lib/validators'da tutuyorum. Başkalarının bunu 'app/validators' içine koyduğunu gördüm. Sana kalmış. Sadece, config içindeki yük yolunuza eklediğinizden emin olun. – uechan