class ActiveModel::Validations::BarcodeValidator
Public Instance Methods
check_validity!()
click to toggle source
We check the validity of :format option More at github.com/rails/rails/blob/aa7fdfb859d8a73f58460a7aba7174a47b5101d5/activemodel/lib/active_model/validator.rb#L180
# File lib/active_validators/active_model/validations/barcode_validator.rb, line 6 def check_validity! format = options.fetch(:format) raise ArgumentError, ":format cannot be blank!" if format.blank? method = "valid_#{format.to_s}?" raise ArgumentError, "Barcode format (#{format}) not supported" unless self.respond_to?(method) end
valid_ean13?(value)
click to toggle source
# File lib/active_validators/active_model/validations/barcode_validator.rb, line 18 def valid_ean13?(value) if value =~ /^\d{13}$/ ean13_check_digit(value.slice(0,12)) == value.slice(12) end end
validate_each(record, attribute, value)
click to toggle source
# File lib/active_validators/active_model/validations/barcode_validator.rb, line 13 def validate_each(record, attribute, value) method = "valid_#{options[:format].to_s}?" record.errors.add(attribute) if value.blank? || !self.send(method, value.to_s) end
Private Instance Methods
ean13_check_digit(value)
click to toggle source
Comes from fr.wikipedia.org/wiki/Code-barres_EAN
# File lib/active_validators/active_model/validations/barcode_validator.rb, line 26 def ean13_check_digit(value) even_sum, uneven_sum = 0, 0 value.split('').each_with_index do |digit, index| if (index+1).even? even_sum += digit.to_i else uneven_sum += digit.to_i end end ((10 - ((even_sum*3 + uneven_sum) % 10)) % 10).to_s end