Gerando tokens para objetos em Rails

Tutoriais - 26/Mai/2021 - por Henrique Morato

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.

Foto de perfil do autor
Henrique Morato

Dev