2012-07-31 12 views
21

Jestem nieco zdezorientowany moimi opcjami dla niestandardowych sprawdzeń w Railsach 3, i mam nadzieję, że ktoś może wskazać mi kierunek, w którym można znaleźć zasób, który może pomóc w moim bieżącym problemie.Szyny 3 - niestandardowe sprawdzanie poprawności

Obecnie mam 3 modele, vehicle, trim i model_year. Wyglądają one następująco:

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

Moje zapytanie jest to - gdy tworzę pojazdu, w jaki sposób można zapewnić, że model_year że wybrany jest ważna dla wykończenia (i odwrotnie)?

Odpowiedz

56

można użyć niestandardową metodę sprawdzania, jak opisano here:

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

Można użyć klasy ActiveModel::Validator tak:

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

To znacznie czystsze w dłuższej perspektywie. To powinna być zaakceptowana odpowiedź. – kgpdeveloper

+0

Gdzie należy umieścić własne weryfikatory? Jaki katalog? –

+0

Trzymam kopalnię w 'lib/validators'. Widziałem, jak inni umieścili go w "app/validators". To zależy od Ciebie. Po prostu upewnij się, że dodajesz go do swojej ścieżki ładowania w config. – uechan

Powiązane problemy