Class: Perfectline::ValidatesExistence::Rails3::ExistenceValidator
- Inherits:
-
ActiveModel::EachValidator
- Object
- ActiveModel::EachValidator
- Perfectline::ValidatesExistence::Rails3::ExistenceValidator
- Defined in:
- lib/rails3.rb
Instance Method Summary collapse
-
#initialize(options) ⇒ ExistenceValidator
constructor
A new instance of ExistenceValidator.
- #validate_each(record, attribute, value) ⇒ Object
Constructor Details
#initialize(options) ⇒ ExistenceValidator
Returns a new instance of ExistenceValidator.
12 13 14 15 16 17 |
# File 'lib/rails3.rb', line 12 def initialize() # set the default message if its unspecified [:message] ||= :existence [:both] = true unless .key?(:both) super() end |
Instance Method Details
#validate_each(record, attribute, value) ⇒ Object
19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
# File 'lib/rails3.rb', line 19 def validate_each(record, attribute, value) normalized = attribute.to_s.sub(/_id$/, "").to_sym association = record.class.reflect_on_association(normalized) if association.nil? or !association.belongs_to? raise ArgumentError, "Cannot validate existence on #{normalized}, not a :belongs_to association" end target_class = nil # dealing with polymorphic belongs_to if association..has_key?(:foreign_type) foreign_type = record.send(association..fetch(:foreign_type)) target_class = foreign_type.constantize unless foreign_type.nil? else target_class = association.klass end if value.nil? or target_class.nil? or !target_class.exists?(value) errors = [attribute] # add the error on both :relation and :relation_id if [:both] errors.push(attribute.to_s.ends_with?("_id") ? normalized : association.primary_key_name) end errors.each do |error| record.errors.add(error, [:message], :message => "does not exist") end end end |