Estoy construyendo una validación personalizada que comprueba un número de cuenta y tipo de código banco con una API externa para comprobar si existen (es decir, es una cuenta de banco del Reino Unido válida apropiada) . Como esta es una operación costosa, no quiero molestarme en pulsar la API a menos que el número de cuenta y el código de clasificación pasen las validaciones integradas de Rails.lleve a cabo una validación sólo si todas las demás validaciones pasan
Por ejemplo, tengo estas validaciones básicas:
validates_presence_of :sort_code, :account_number
validates_format_of :sort_code, :with => Regexes::SORT_CODE
validates_format_of :account_number, :with => Regexes::ACCOUNT_NUMBER
entonces tengo mi validación personalizada:
validate :check_valid_bank_account
def check_valid_bank_account
# code here is irrelevant, but essentially this hits the API
# if it's a valid UK bank account all is OK, if not we add an error
end
Lo que quiero asegurar es que la validación personalizada sólo se realiza si el resto del modelo es válido. No tiene sentido pagar a 25p para que me digan que no me proporcionaron ningún número de cuenta cuando puedo resolverlo yo mismo.
Soy consciente de que podría escribir algo de lógica que compruebe que los dos atributos no están en blanco y los compara con la expresión regular de forma manual ... pero eso no parece una forma muy Rails.
no creo que esto va a funcionar si la validación check_valid_bank_account se ejecuta antes de que los otros validaciones. –
Las validaciones se ejecutan en el orden en que están definidas, por lo que dependerá de eso. – edgerunner
Esto funcionó para mí, pero ¿hay alguna otra manera de hacer lo mismo? – digitalWestie