Ruby on rails 如何从表单传递值以进行验证
我正在使用RubyonRails创建一个直接借记的表单 我已经设置了表单,并设置了一些基本验证,以确保所有字段都已填写 接下来我想设置一些验证来检查IBAN(国际银行账号)号码是否是有效的IBAN 这涉及到操作字符串、将其转换为数字和做一些数学运算的几个步骤,所有这些我都为其编写了一个方法 我的问题是,我似乎无法将IBAN传递到方法中进行验证 我的确认:Ruby on rails 如何从表单传递值以进行验证,ruby-on-rails,forms,Ruby On Rails,Forms,我正在使用RubyonRails创建一个直接借记的表单 我已经设置了表单,并设置了一些基本验证,以确保所有字段都已填写 接下来我想设置一些验证来检查IBAN(国际银行账号)号码是否是有效的IBAN 这涉及到操作字符串、将其转换为数字和做一些数学运算的几个步骤,所有这些我都为其编写了一个方法 我的问题是,我似乎无法将IBAN传递到方法中进行验证 我的确认: class DirectDebit < ActiveRecord::Base attr_accessible :address, :am
class DirectDebit < ActiveRecord::Base
attr_accessible :address, :amount, :bank_branch, :bic, :date_for_payment, :email, :iban, :name, :name_of_account, :phone
validates :address, :bank_branch, :bic, :date_for_payment, :email, :name, :name_of_account, :phone, presence: true
validates :amount, numericality: {greater_than_or_equal_to: 0.01}
validate :iban
def iban
## Converts all letters in 'number' to uppercase and removes any spaces and anything else that isn't a letter, number or underscore
iban = iban.upcase.scan(/\w/).join
## removes any underscores as ".scan(/\w/)" above reads in letters digits and underscores.
iban = iban.gsub(/_/, '')
## Calculates the length of 'number'
iban_length = iban.length
## Saves the first two letters in 'number' as 'country'
country = iban.scan(/\A../).join
## Checks if the length is correct for the country
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 "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
## Identifies what the first 4 characters are, and removes them from the rest of the number
first_four_characters = iban.slice!(0..3)
## Adds the first four characters to the end of the rest
reordered_number = iban + first_four_characters
## Set up an array and have each character in the reordered number read into it, changing it to the appropriate number if it is a letter.
letters_removed = []
reordered_number.scan(/./) do |character|
case character
when "A"
letters_removed << 10
...
when "9"
letters_removed <<9
end
end
## Change the array to a String and then to a number
letters_removed = letters_removed.join.to_i
## Check to see if it gives a remainder of one when divided by 97
remainder = letters_removed % 97
## Output that it is a valid number if the remainder when it is divided by 97 is 1 and if it is the correct length for the country.
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 is: " + special)
end
end
end
class DirectDebit
class YourModel < ActiveRecord::Base
validate :your_method
def your_method
#your stuff should return true or false
end
end
classyourmodel
希望它能有所帮助。在您的模型中,iban已经是一种方法,因为它是一个数据库列。因此,您需要执行以下操作:
validate :valid_iban?
def valid_iban?
## all of your current validation iban goes here
end
如果您希望能够验证模型的iban以及可能的其他iban:
app/models/validates_iban.rb
class ValidatesIban
def self.valid?(iban)
## all your validation goes here
end
end
在您的模型中:
validate :valid_iban?
def valid_iban?
unless ValidatesIban.valid?(iban)
self.errors(:iban, "is not valid")
end
end
ValidatesIban方法的好的一面是:您可以在其他地方重用。我想这一部分已经介绍得很好了,但我想添加一些其他选项:
你可以使用gem'iban tools'
此外,对于(SEPA)直接借记表单/协议,请尝试此SEPA_king gem,它还可以验证BIC和债权人标识符(您可以看到,在IBAN内部,它还使用IBAN工具)
干杯 这是我的一个基本版本。我做了,有两个长的重复部分,我从中间剪下,用刚刚读过的行替换…返回真或假不是问题,没有什么是通过测试的,因此每次我都有效地得到假,除非我硬编码一个将验证为true的IBAN。请将您的方法名称更改为其他名称。在第一行中,请尝试IBAN=self.IBAN.upcase.scan(/\w/).join
。另外,如果您不确定该值是多少,请使用debugger或仅将Rails.logger.info“*”*50;Rails.logger.info[:iban\u after\u smth,iban].inspect
谢谢,ValidateBan方法在我对它做了一点修改后就起了作用。