Clase para generar aleatorios
En mi última entrada en este blog, mostré el método que permitía generar una llave aleatoria.
Las cosas han ido evolucionando y resultó que uno de los formularios del sistema requería el famoso CAPTCHA que igualmente debía generar 4 caracteres aleatorios.
RoR fomenta fuertemente el principio DRY (Don't Repeat Yourself). Y bueno, en cualquier otro lenguaje es mejor no repetir código.
De manera que escribí una clase que generara aleatorios. Esta clase es como una especie de utilidad, por lo tanto debe ir dentro del directorio lib ; allí cree un directorio utilidades y dentro de este la clase GeneradorAleatorios; acá les presento el código para que me den sus opiniones:
class Utilidades::GeneradorAleatorio
CHARS = ("a".."z").to_a + ("A".."Z").to_a + ("0".."9").to_a
NUMBERS = ("0".."9").to_a
# genera una palabra aleatoria con la cantidad de caracteres especificada
# utiliza las letras de la 'a' a la 'z' minúsculas y masyúsculas y los números del '0' al '9'
def self.generar_palabra(cantidad = 10)
return self.generar(cantidad) { CHARS }
end
# genera una número aleatorio con la cantidad de dígitos especificada
# utiliza los números del '0' al '9'
def self.generar_numero(cantidad = 10)
return self.generar(cantidad) { NUMBERS }
end
# genera una cadena de caracteres aleatoria
# debe proveerse un bloque que retorne un arreglo de donde se sacarán los caracteres
def self.generar(cantidad = 10)
if block_given?
caracteres = yield
else
caracteres = CHARS
end
aleatorio = ""
1.upto(cantidad) { |i| aleatorio << caracteres[rand(caracteres.size)] }
return aleatorio
end
end
Así mas o menos se debería usar:
- Generar un String de 4 caracteres de un arreglo específico.
Utilidades::GeneradorAleatorio.generar(4) { ['1','0','a','b','z'] }
- Generar un String de 40 caracteres, letras mayúculas, minúsculas y digitos:
Utilidades::GeneradorAleatorio.generar_palabra(40)
- Generar un String de 30 caracteres, pero solamente dígitos:
Utilidades::GeneradorAleatorio.generar_numero(30)
Saludos!