142 palavras

TIL: delegate com prefixo, e o allow_nil

, em Rails, TIL

O delegate do Rails cria um método que repassa a chamada para outro objeto. Com prefix: true, o nome do método ganha o nome do destino:

class User < ApplicationRecord
  belongs_to :company
  delegate :name, to: :company, prefix: true
end

user.company_name
# => "Acme"

É o mesmo que user.company.name, mas quem usa o User não precisa saber que existe uma Company no meio.

A pegadinha aparece quando a associação é nil:

User.new.company_name
# => DelegationError: company_name delegated to company, but company is nil

Se um usuário sem empresa é um caso válido, use allow_nil: true, e o método devolve nil em vez de levantar erro:

delegate :name, to: :company, prefix: true, allow_nil: true

User.new.company_name
# => nil

O to: recebe o nome de um método, não de um model: pode ser uma associação, um atributo ou qualquer método do objeto. Documentação do delegate.