Agregando enlaces a la URL en vivo del blog en el dashboard de posts
Es algo pequeño, pero me lo encontraba una y otra vez: el dashboard de /posts lista todos mis posts del blog, y cada vez que quiero leer uno en el blog de verdad, tengo que navegar hasta él manualmente. Los títulos eran solo texto plano. La acción natural, hacer clic en el título, no hacía nada útil.
El arreglo suena obvio: convertir el título en un enlace. Pero hay una complicación. El patrón de la URL no es el mismo para cada blog. Mi tabla blogs ya tenía una columna base_url (https://vdaluz.com), pero la ruta entre el dominio y el slug, /blog/ para vdaluz.com, estaba hardcodeada en el partial de la página show. Eso funcionaba para un solo blog, pero se rompería en cuanto agregara otro blog con una estructura de URL distinta.
Así que necesitaba hacer configurable ese segmento de ruta.
Lo que construí
Agregué una columna post_path_prefix a blogs, una cadena como /blog que va entre base_url y el slug del post. Después Post#live_url arma la 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
La condición de pub_date es intencional. Los borradores y los posts sin fecha de publicación todavía no tienen una URL en vivo; mostrar un enlace roto es peor que no mostrar ninguno.
La migración rellena las filas existentes con /blog para que la configuración actual siga funcionando sin ningún arreglo manual de datos:
reversible do |dir|
dir.up { Blog.update_all(post_path_prefix: "/blog") }
end
En el índice, los títulos de posts publicados ahora enlazan hacia afuera con target="_blank" rel="noopener". Los borradores caen de vuelta a la página show interna. La insignia de URL de la página show, que antes estaba hardcodeada como "#{post.blog.base_url}/blog/#{post.slug}", ahora usa post.live_url en su lugar, así que hay una sola fuente de verdad para la forma de la URL.
Lo que casi se me pasó
El spec del issue decía que agregara una columna live_url a blogs. Pero base_url ya existía y hacía el mismo trabajo. Agregar live_url habría sido un campo redundante sin un dueño claro. Descarté esa parte del spec y mantuve la columna existente; el agregado de post_path_prefix era todo lo que en realidad hacía falta.
Resultado
Clic en el título de un post publicado, y se aterriza en el post en vivo. Toma unos 2 segundos menos de esfuerzo mental que antes. No es glamoroso, pero es el tipo de cosa que hace que una herramienta se sienta hecha a medida.
Lecturas relacionadas
Qué pasa cuando un job transmite y nadie escucha
Cerrando el ciclo de la imagen destacada: frontmatter que solo inserta, una validación que detectó drift real, y un broadcast sin oyentes.
Una corrección de desfase de documentación que no fue tan aburrida como sonaba
Tres puntos de auditoría que se volvieron algo más: una afirmación a medio corregir, un restablecimiento de contraseña muerto en silencio, y un correo de staging que enlazaba a producción.
Un 500 escondido dentro de las rutas aisladas de un engine montado
El dashboard de jobs devolvía un 500 en vez de una página de login: los route helpers sin calificar se resuelven contra el engine, no contra la app. Una línea, más su gemela dormida.
También te podría ser útil
Proton Drive
Almacenamiento en la nube cifrado, del equipo detrás de Proton Mail.
Como socio de Proton, obtengo ingresos por las compras que califican de los servicios de privacidad y seguridad de Proton (Pass, Mail, VPN, Drive).
Más informaciónProton Mail
Correo electrónico cifrado de extremo a extremo, con arquitectura de acceso cero.
Como socio de Proton, obtengo ingresos por las compras que califican de los servicios de privacidad y seguridad de Proton (Pass, Mail, VPN, Drive).
Más informaciónProton VPN
VPN comercial con filtrado NetShield e interruptor de apagado automático.
Como socio de Proton, obtengo ingresos por las compras que califican de los servicios de privacidad y seguridad de Proton (Pass, Mail, VPN, Drive).
Más información