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