Mais DRY no seu YAML

Olha quem está vivo? Sim, sou eu. Sem mais enrolação.

Como já publicado no post do DRY config/database.yml, é possível usar aliases para evitar duplicidade de valores, mas como fazer isso para chaves simples? E porque eu tive essa necessidade?

Em uma view onde eu preciso exibir uma mensagem de disponibilidade de expedição de um produto, tenho algo como:

app/views/products/show.html

1
2
3
4
5
6
...
<dl>
  <dt>Prazo para expição</dt>
  <dd><%= I18n.t('.delivery_days', count: product.delivery_days) %></dd>
</dl>
...

config/locales/pt-BR.yml com repetição

1
2
3
4
5
6
7
pt-BR:
  products:
    show:
      delivery_days:
        one: Pronta Entrega
        other: Disponível em %{count} dias úteis
        zero: Pronta Entrega

Considerando que eu tenha que mostrar a mensagem quando da disponibilidade de entrega é de zero ou um dia, mas não quero duplicar a mensagem. O que podemos fazer?

Antes da chave que nós queremos “copiar”, criamos o alias &alias_name, e no lugar do valor que vamos repetir, usamos o *alias_name

config/locales/pt-BR.yml sem repetição

1
2
3
4
5
6
7
pt-BR:
  products:
    show:
      delivery_days:
        &oneDeliveryDay one: Pronta Entrega
        other: Disponível em %{count} dias úteis
        zero: *oneDeliveryDay

No exemplo acima, nós identificamos a chave :one com o alias onDeliveryDay e aplicanos na chave :zero