Rails 3 - 自定义验证

时间:2012-07-31 09:14:44

标签: ruby-on-rails ruby-on-rails-3 activerecord

我对Rails 3中的自定义验证选项感到有些困惑,我希望有人可以指出我可以帮助解决当前问题的资源。

我目前有3个模型,vehicletrimmodel_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

我的疑问是这样的 - 当我创建车辆时,如何确保所选择的model_year对修剪有效(反之亦然)?

2 个答案:

答案 0 :(得分:60)

您可以使用自定义验证方法,如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

答案 1 :(得分:25)

您可以使用ActiveModel::Validator类,如下所示:

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