Desenvolvimento

Como usar as validações do Active Record

Existem várias maneiras de validar dados antes de serem salvos em seu banco de dados, incluindo restrições de banco de dados nativas, validações do lado do cliente e validações no nível do controlador. Todas essas formas têm seus prós e contras, porém, nesse artigo vamos discutir sobre a validação de modelo/objeto.

Porque usar as validações?

Nem sempre queremos permitir que todos os dados inseridos em nosso banco de dados sejam salvos. Em alguns casos, é importante garantir que certas condições, como as regras de negócio, sejam atendidas antes de permitir que um registro seja salvo. É aqui que entram as validações do Active Record.

Quando acontecem as validações?

As validações geralmente são executadas antes que os comandos de INSERT ou UPDATE sejam enviados ao banco de dados. Se alguma validação falhar, o objeto será marcado como inválido e o Active Record não executará a operação de tais comandos.

Os seguintes métodos podem ser executados:

  • create
  • create!
  • save
  • save!
  • update
  • update!

Porém, existem alguns métodos que não executam as validações, são eles:

  • decrement!
  • decrement_counter
  • increment!
  • increment_counter
  • insert
  • insert!
  • insert_all
  • insert_all!
  • toggle!
  • touch
  • touch_all
  • update_all
  • update_attribute
  • update_column
  • update_columns
  • update_counters
  • upsert 
  • upsert_all

Ajudantes de validação

Existem vários tipos de validações disponíveis no Active Record, como presença, unicidade, comprimento máximo ou mínimo, formato, entre outras. Cada validação é uma classe diferente que estende a classe ActiveModel::Validations::Validator.

E para facilitar a nossa vida, o Active Record oferece muitos auxiliares de validação pré-definidos que você pode usar diretamente dentro de suas definições de classe. Esses auxiliares fornecem regras de validação comuns. Cada vez que uma validação falha, um erro é adicionado à coleção de erros do objeto, e este é associado ao atributo que está sendo validado.

Cada auxiliar aceita um número variável de nomes de atributos, por isso, com uma única linha de código, você pode adicionar o mesmo tipo de validação a vários atributos.

E como podemos usar esses ajudantes de validação?

Dentro do seu modelo, invoque o método validates, passando como parâmetro, os campos que terão essa validação, juntamente com o auxiliar de validação desejado:

No exemplo acima, tenho um atributo name que tem uma validação de presença, e para isso uso o ajudante de validação presence.

Existem vários ajudantes de validação, sendo eles:

  • acceptance
  • validates_associated
  • confirmation
  • comparison
  • exclusion
  • format
  • inclusion
  • length
  • numericality
  • presence
  • absence
  • uniqueness
  • validates_with
  • validates_each

Validações customizadas

Você também pode criar suas próprias validações e para isso existem dois caminhos, criar um validador, que basicamente são classes que herdam a classe ActiveModel::Validator e implementam o método validate, mas também existe a possibilidade de criar métodos que façam essa validação customizada. Segue abaixo um exemplo de um método personalizado:

No exemplo acima, foi invocado o método validate e passado como parâmetro o nome do método personalizado que faz a validação. Dentro deste método, precisamos adicionar o erro dentro da coleção de erros para que esse objeto fique marcado como inválido e não seja salvo.

Para adicionar um erro na coleção de erros, usamos o método add e passamos como parâmetro o nome do atributo que está inválido, em seguida, passamos a mensagem de erro como uma string igual no exemplo acima ou como um símbolo representando uma chave de tradução no I18N, como demonstrado no exemplo abaixo:

Sendo que ficaria assim no arquivo de traduções:

Vale ressaltar que existem detalhes para serem vistos dentro da documentação oficial do Rails, caso queira de fato aprofundar nesse assunto.

 

Espero que esse artigo tenha ajudado com conceitos, como utilizar as validações do Active Record e principalmente a facilidade que temos em fazer algo importante como validar dados, mas de forma bem simples e funcional. Se você gostou desse conteúdo, acesse os outros textos da Jera.

 

Texto por Caio Henrique.