No meu Modelo Eu tenho:
validates :special_code, presence: true, uniqueness: true
before_save :special_code, :regenerate_special_code
Controlador:
def special_code
( (0...8).map { char = (65 + rand(26)).chr; }[0..rand(2...4)] << rand(1..9) ).join
end
O que eu quero fazer é regenerar o special_code
se não for único. Pseudo-código:
def regenerate_special_code
special_code if special_code != unique
end
Atualmente, os trilhos emitem um erro dizendo "código_específico não é exclusivo". (Eu não quero que isso aconteça. O usuário NUNCA deve ver esse erro. Ele deve apenas chamar regenrate_special_code
até que um código exclusivo seja criado e, em seguida, armazene o registro no banco de dados.)
Respostas:
0 para resposta № 1model.rb
....
before_save :generate_special_code
....
private
def generate_special_code
self.special_code = ( (0...8).map { char = (65 + rand(26)).chr; }[0..rand(2...4)] << rand(1..9) ).join
generate_special_code if Model.exsits?(special_code: self.special_code)
end
....
este validate
linha e o regenerate_special_code
não são necessários. Meu exemplo irá gerar algum código_específico até ser exclusivo.
PS. Examinando o SecureRandom, parece que você está tentando gerar um token aleatório para o seu modelo e isso pode ser realizado de maneira muito mais limpa com algo como SecureRandom.uuid