Rails - Active Model

Renan PortoRenan Porto
2 min read

O Active Model é uma biblioteca que possui recursos que podem ser usados ​​em objetos Ruby simples que requerem recursos semelhantes aos de um modelo (model), mas não estão vinculados a nenhuma tabela em um banco de dados.

Resumindo, o ActiveRecord deve ser usado quando o modelo representa uma tabela no banco de dados; enquanto o ActiveModel nos da acesso a muitos recursos do ActiveRecord, sem a necessidade de ter um vínculo com o banco de dados.

Recursos disponíveis

ActiveModel::API

Esse pra mim, é um dos recursos mais sensacionais do rails! Ao utilizar o ActiveModel::API, a gente na verdade está adicionando alguns recursos, onde irei comentar os 3 mais interessantes na minha opinião:

  1. Translation

Integra o seu objeto e a estrutura de internacionalização do Rails (i18n).

# config/locales/app.pt-BR.yml
pt-BR:
  activemodel:
    attributes:
      order:
        price: "Preço"

# model/order.rb
class Order
  extend ActiveModel::Translation
end

# irb
Order.human_attribute_name("price") # Price
I18n.locale = :"pt-BR"

Order.human_attribute_name("price") # Preço
  1. Validations

Pra mim, um dos recursos mais sensacionais!

Permite validar objetos e garantir a integridade e a consistência dos dados dentro do seu aplicativo.

class Order
  include ActiveModel::Validations

  attr_accessor :price, :email

  validates :price, presence: true
  validates :email, format: { with: URI::MailTo::EMAIL_REGEXP }
end

# irb
order = Order.new
order.price = 200
order.valid? # false (falta o email!)
order.errors # <ActiveModel::Errors [#<ActiveModel::Error attribute=email, type=invalid, options={:value=>nil}>]>

order.email = "renan.porto"
order.valid? # false (email inválido)
order.errors # <ActiveModel::Errors [#<ActiveModel::Error attribute=email, type=invalid, options={:value=>"renan.porto"}>]>

order.email = "renan.porto1099@gmail.com"
order.valid? # true
  1. SecurePassword

Prove uma forma de persistir senhas de forma segura com criptografia. Esse recurso depende da gem bcrypt para funcionar.

class Person
  include ActiveModel::SecurePassword

  has_secure_password
  has_secure_password :recovery_password, validations: false

  attr_accessor :password_digest, :recovery_password_digest
end

person = Person.new
person.valid? # false

person.password = "example"
person.password_confirmation = "otherpass"
person.valid? # false

person.password = "example"
person.valid? # true

Conclusão

O ActiveModel é uma ferramenta poderosa que muita gente conhece devido a estar incluido no ActiveRecord, porém poucas pessoas sabem que podem utilizar seus recursos separados, independente do banco de dados.

Se eu fosse sugerir um recurso que é obrigatório conhecermos, é o Validations. Esse recurso é muito útil para validar contratos e regras de negócio.

Referências

https://guides.rubyonrails.org/active_model_basics.html

0
Subscribe to my newsletter

Read articles from Renan Porto directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

Renan Porto
Renan Porto