2014-10-09 101 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

它應該是'驗證:valid_iban'和'驗證:iban,presence:true'兩個獨立的驗證,你應該傳遞一個方法來驗證。 – Surya 2014-10-09 09:27:50

+0

我剛剛做到了。但問題是一樣的。我認爲它在驗證碼 – 2014-10-09 09:37:42

+0

因此,您的條件:'餘額== 1 && length_correct_for_country'總是被評估爲false,然後檢查您的邏輯是否正確。 – Surya 2014-10-09 09:41:30

回答

4

iban-tools寶石可用於這一目的,它工作得很好。

要在Rails中使用gem,我推薦編寫一個驗證器類。

首先把這個在您的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? validates:iban,presence:true 但問題是一樣的 – 2014-10-09 09:45:42

+0

也許問題在這裏:'letters_removed << 9'應該是'letters_removed << 9' – 2014-10-09 09:52:03

+0

不幸的是 – 2014-10-09 09:57:19