Adicionando links dos posts ao vivo no painel
É uma coisa pequena, mas eu vivia esbarrando nela: o painel /posts lista todos os meus posts do blog, e toda vez que eu queria ler um no blog de verdade, tinha que navegar até ele manualmente. Os títulos eram só texto simples. A ação natural, clicar no título, não fazia nada.
A correção parece óbvia: transformar o título em link. Mas tem uma pegadinha. O padrão de URL não é o mesmo para todos os blogs. Minha tabela blogs já tinha uma coluna base_url (https://vdaluz.com), mas o trecho de caminho entre o domínio e o slug, /blog/ no caso do vdaluz.com, estava fixo no partial da página de exibição. Isso funcionava para um blog, mas quebraria assim que eu adicionasse outro blog com uma estrutura de URL diferente.
Então eu precisava tornar esse trecho de caminho configurável.
O que eu construí
Adicionei uma coluna post_path_prefix em blogs; uma string como /blog que fica entre base_url e o slug do post. Depois Post#live_url monta a URL completa:
def live_url
return nil if blog.base_url.blank? || pub_date.blank?
"#{blog.base_url.chomp('/')}#{blog.post_path_prefix}/#{slug}"
end
A trava do pub_date é intencional. Rascunhos e posts sem data de publicação ainda não têm URL ao vivo; mostrar um link quebrado é pior do que não mostrar link nenhum.
A migration preenche retroativamente as linhas existentes com /blog, então a configuração atual continua funcionando sem nenhum ajuste manual de dados:
reversible do |dir|
dir.up { Blog.update_all(post_path_prefix: "/blog") }
end
No índice, os títulos dos posts publicados agora abrem em link com target="_blank" rel="noopener". Rascunhos caem de volta para a página de exibição interna. O selo de URL da página de exibição, que antes era fixo como "#{post.blog.base_url}/blog/#{post.slug}", agora usa post.live_url, então existe uma única fonte de verdade para o formato da URL.
A coisa que quase passou batido
O spec do issue pedia para adicionar uma coluna live_url em blogs. Mas base_url já existia e fazia o mesmo trabalho. Adicionar live_url teria sido um campo redundante sem dono claro. Descartei essa parte do spec e mantive a coluna existente; o acréscimo do post_path_prefix era tudo que realmente fazia falta.
Resultado
Clico no título de um post publicado, caio no post ao vivo. Isso poupa uns 2 segundos de esforço mental a menos do que antes. Nada glamouroso, mas é esse tipo de coisa que faz uma ferramenta parecer feita sob medida para você.
Leitura relacionada
Uma correção de desvio de documentação que não foi tão chata quanto parecia
Três itens da auditoria que cada um virou outra coisa: uma alegação meio corrigida, uma recuperação de senha silenciosamente morta, e um e-mail de staging que apontaria para produção.
Um 500 escondido dentro das rotas isoladas de uma engine montada
O painel de jobs retornava um 500 em vez de uma página de login: helpers de rota sem qualificação resolvem contra a engine, não contra a aplicação. Uma linha, mais o gêmeo dormente dela.
Apagando código morto, e pegando um motivo errado para uma resposta certa
Uma issue de limpeza com uma justificativa errada, uma varredura de documentação que não era necessária, e a credencial órfã que uma revisão pegou.
Você também pode achar útil
Proton Drive
Armazenamento em nuvem criptografado, da equipe por trás do Proton Mail.
Como parceiro da Proton, ganho com compras qualificadas dos serviços de privacidade e segurança da Proton (Pass, Mail, VPN, Drive).
Saiba maisProton Mail
E-mail criptografado de ponta a ponta, com arquitetura de acesso zero.
Como parceiro da Proton, ganho com compras qualificadas dos serviços de privacidade e segurança da Proton (Pass, Mail, VPN, Drive).
Saiba maisProton VPN
VPN comercial com filtragem NetShield e interruptor de desligamento automático.
Como parceiro da Proton, ganho com compras qualificadas dos serviços de privacidade e segurança da Proton (Pass, Mail, VPN, Drive).
Saiba mais