web-dev-qa-db-fra.com

Rails 3 - Validation personnalisée

Je suis quelque peu confus par mes options de validations personnalisées dans Rails 3, et j'espère que quelqu'un peut me diriger vers une ressource qui peut aider avec mon problème actuel.

J'ai actuellement 3 modèles, vehicle, trim et model_year. Ils se présentent comme suit:

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

Ma question est la suivante: lorsque je crée un véhicule, comment puis-je m'assurer que le modèle_année sélectionné est valide pour la version (et vice versa)?

25
H O

vous pouvez utiliser une méthode de validation personnalisée, comme décrit ici :

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
62
davidrac

Vous pouvez utiliser le ActiveModel::Validator classe comme ça:

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
26
Andrew Nesbitt