2014-10-09 4 views
1

Я пытаюсь сделать проверку iban как любой код страны iban. Я получил некоторую помощь от stackoverflow для сборки этого кода, но все же у меня есть некоторые проблемы, и я не знаю, где это.Ruby on Rails Проверка IBAN в файле модели

Всегда я получаю сообщение об ошибке «Это неправда IBAN». Но иногда я пытался исправить код iban как определенные страны.

Есть ли кто-нибудь помочь мне в этом коде для проведения этой проверки, пожалуйста?

Код здесь:

class BankAccount < ActiveRecord::Base 
    belongs_to :user 

    validates :bank_name, presence: true 
    validate :iban, :valid_iban?, presence: true 

    private 

    def valid_iban? 
      ibans = iban.upcase.scan(/\w/).join 

      ibans = ibans.gsub(/_/, '') 

      iban_length = ibans.length 

      country = ibans.scan(/\A../).join 

      length_correct_for_country = true 

      case country 
       when "IE" 
        if iban_length == 22 
         length_correct_for_country = true 
        else 
         length_correct_for_country = false  
        end 
       when "AL" 
        if iban_length == 28 
         length_correct_for_country = true 
        else 
         length_correct_for_country = false  
        end 
       when "TR" 
        if iban_length == 26 
         length_correct_for_country = true 
        else 
         length_correct_for_country = false  
        end 
       when "GB" 
        if iban_length == 22 
         length_correct_for_country = true 
        else 
         length_correct_for_country = false  
        end 
       when "VG" 
        if iban_length == 24 
         length_correct_for_country = true 
        else 
         length_correct_for_country = false  
        end 
      end 

      first_four_characters = ibans.slice!(0..3) 

      reordered_number = ibans + first_four_characters 

      letters_removed = [] 
      reordered_number.scan(/./) do |character| 
       case character 
       when "A" 
        letters_removed << 10 
       when "9" 
        letters_removed <<9 
       end 
      end 

      letters_removed = letters_removed.join.to_i 

      remainder = letters_removed % 97 

      if remainder == 1 && length_correct_for_country 

      else 
       remainder = remainder.to_s 
       errors.add(:iban, " That is not a valid IBAN. The IBAN that is being supplied") 
      end 

    end 

end 
+0

Он должен быть 'Validate: valid_iban' и 'validates: iban, presence: true 'две отдельные проверки, вы должны передать метод' validate'. – Surya

+0

Я сделал это только сейчас. Но проблема такая же. Я думаю, что это код подтверждения –

+0

Итак, ваше условие: 'остаток == 1 && length_correct_for_country' всегда оценивается как false, проверьте правильность вашей логики. – Surya

ответ

4

iban-tools камень доступен для этой цели, и она работает очень хорошо.

Чтобы использовать драгоценный камень в Rails, я рекомендую написать класс валидатора.

Во-первых это в вашем Gemfile:

gem 'iban-tools' 

и запустить bundle.

Затем создайте новый каталог app/validators и внутри, что файл с именем iban_validator.rb с этим содержимым:

require 'iban-tools' 

class IbanValidator < ActiveModel::Validator 
    def validate(record) 
    unless IBANTools::IBAN.valid?(record.iban) 
     record.errors.add :iban, record.errors.generate_message(:iban, :invalid) 
    end 
    end 
end 

В вашей модели класса поставить это:

validates_with IbanValidator 
0

вам нужно, вероятно, что-то вроде:

validate :valid_iban? 

def valid_iban? 

end 
+0

мой текущий код: validate: valid_iban? проверяет: iban, наличие: true , но проблема такая же –

+0

может быть проблема здесь: 'letters_removed << 9' должно быть' letters_removed << 9' –

+0

к сожалению нет –

Смежные вопросы