Form objects: lógica complexa
O curso trata de form objects no Rails: classes Ruby simples que fazem o papel de model por trás de um formulário e guardam as validações de contexto dele. Ele explica ActiveModel::Model e ActiveModel::Attributes, validações condicionais, próprias e entre campos, e formulários cujos campos se espalham por vários models. Mostra como o form object entrega dados validados a um service object que grava dentro de uma transação. Também troca o accepts_nested_attributes_for por objetos de entrada e termina com padrões de RSpec para testar formulários e o fluxo até o serviço.
O que você vai aprender
- ✓Quando um formulário pede um form object e quando as validações do model bastam
- ✓Atributos com tipo e integração com form_with via ActiveModel::Model e ActiveModel::Attributes
- ✓Validações condicionais, próprias e entre campos, com guard clauses
- ✓Como dividir o trabalho entre controller, form object e service object
- ✓Registros filhos aninhados sem accepts_nested_attributes_for
- ✓Testes de form objects com RSpec, de specs unitárias a specs de fluxo
O que é um form object?
Imagine uma página de inscrição num curso. O usuário preenche um formulário, mas nos bastidores esse único envio precisa criar um User, um Enrollment e um prêmio inicial de XP. Qual model deve validar todos esses campos? O User não sabe nada de matrículas, e o Enrollment não sabe nada de senhas.
Ler a aula completa grátis →Currículo
7 aulasO que é um form object?
Define form objects e mostra como eles tiram validações de contexto dos models e deixam o controller enxuto.
ActiveModel::Model e attributes
Explica como ActiveModel::Model e atributos com tipo fazem um objeto simples funcionar com form_with e validações.
Validações em form objects
Cobre validações prontas, condicionais, próprias e entre campos, e em qual camada cada regra deve ficar.
Formulários multi-model
Monta um formulário com campos de vários models e um serviço que grava tudo dentro de uma transação.
Form objects e service objects juntos
Percorre um fluxo completo de transferência de curso, separando a validação de entrada da lógica de negócio.
Atributos aninhados sem accepts_nested_attributes_for
Troca o accepts_nested_attributes_for por objetos de entrada, parâmetros em array e um serviço que cria pai e filhos.
Testando form objects
Mostra padrões de RSpec para testar validações, guard clauses, casos-limite e a passagem do formulário ao serviço.