Algumas vezes precisamos gerar um código único para representar no banco de dados um objeto como: uma compra, um pagamento, uma operação, entre outros. Para isso normalmente usamos um código alfanumérico único e aleatório, comumente conhecido como token.
Antes, nas versões até o Rails 4 você teria que fazer seu próprio método, algo como:
class Order < ActiveRecord::Base
before_create :set_token
private
def set_token
self.token = SecureRandom.hex(10)
set_token if Order.exists?(token: token)
end
end
A partir do Rails 5 temos acesso a uma maneira de fazer isso de forma rápida e eficiente, usando o método has_secure_token
.
Basta criar uma migração para adicionar um campo do tipo token
ao model:
$ rails g add_token_to_order token:token
E assim usar o método has_secure_token
:
class Order < ActiveRecord::Base
has_secure_token
Agora toda vez que um novo pedido é criado, um token
é gerado no banco no momento da criação. A título de curiosidade, por trás dos panos o código usado por padrão é o SecureRandom::base58
com 24
caracteres, que é o mínimo, mas essa configuração pode ser ajustada.
Caso queira um token com outro nome, você pode criar a mesma migração usando o nome que quiser e o tipo token
, mas na chamada do método colocar o novo nome:
has_secure_token :auth_token # token com nome :auth_token
Temos então uma forma rápida e robusta de gerar tokens com simplicidade. Para ver outras opções, customizações e como regenerar o token, consulte a documentação.