2012-07-31 23 views
21

Estoy algo confundido por mis opciones de validación personalizada en Rails 3, y espero que alguien me pueda indicar un recurso que pueda ayudarme con mi problema actual.Rails 3 - Validación personalizada

Actualmente tengo 3 modelos, vehicle, trim y model_year. Se ven como sigue:

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

Mi pregunta es esta: cuando estoy creando un vehículo, ¿cómo puedo asegurarme de que el modelo_año que se selecciona es válido para el ajuste (y viceversa)?

Respuesta

56

puede utilizar el método de validación personalizada, tal como se describe 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

Usted puede utilizar la clase ActiveModel::Validator así:

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

Esto es mucho más limpio en el largo plazo. Esta debería ser la respuesta aceptada. – kgpdeveloper

+0

¿Dónde debería poner sus validadores personalizados? ¿Qué directorio? –

+0

Guardo el mío en 'lib/validators'. He visto a otros ponerlo en 'app/validators'. Tu decides. Solo asegúrate de agregarlo a tu ruta de carga en config. – uechan

Cuestiones relacionadas