sagas/odisea-del-blog-maestro/014-arreglando-las-rutas-y-el-archivo.md

2026-03-24 published

Episodio 014 — Arreglando las rutas y el archivo

Episodio 014 — Arreglando las rutas y el archivo

Serie: bitácora de ingeniería — caprini.dev
Enfoque: admitir el fallo, explicar el arreglo y dejar constancia en el log.


Mea culpa: el contenido existía, la puerta no

Los episodios llevaban tiempo viviendo en src/content/docs/system/episodes/ como Markdown validado en la colección docs. En la Home se listaban fragmentos — fechas, títulos, estado — pero no había una ruta HTTP que sirviera el cuerpo completo del episodio. En la práctica, para un visitante (o para quien quisiera enlazar un capítulo concreto), eso era contenido inaccesible: el archivo en el repo sí; la lectura en el sitio, no.

Fue un descuido de producto, no de escritura: confundí “el episodio está en el Content Layer” con “el episodio es navegable”. Corregirlo no reescribe la historia; la publica.


Qué hace Astro aquí: rutas dinámicas

Astro genera páginas estáticas en build. Una página fija como índex.astrosolo produce/`. Para N episodios sin copiar N archivos a mano, hace falta un patrón de ruta con parámetro.

El patrón es src/pages/blog/[slug].astro: el segmento [slug] es un comodín. La función getStaticPaths se ejecuta en build, recorre las entradas de la colección que correspondan (en nuestro caso, todo lo bajo system/episodes/) y devuelve, para cada una, { params: { slug: '001-identidad-y-setup' }, props: { … } }. Astro genera entonces /blog/001-identidad-y-setup, /blog/002-galeria-dinamica-y-content-layer, etc., cada una con su HTML estático.

El slug es solo el nombre del fichero sin extensión (NNN-tema.mdNNN-tema), alineado con la convención del router y de la memoria del proyecto. Dentro de la página, getEntry + render vuelcan el Markdown a componentes: mismo contrato de frontmatter (title, description, status, date), misma fuente de verdad.


Archivo completo

Además del detalle por slug, src/pages/blog/index.astro actúa como índice tipo lista de logs: tabla minimalista con fecha, id de log y enlace. Así el archivo deja de depender solo de los tres últimos episodios en la Home.


Cierre de log

  • Antes: episodios en disco y en colección, sin URLs dedicadas.
  • Después: /blog como archivo, /blog/[slug] como lectura completa con estilos de lectura (prose) acordes al sitio.

Si este episodio se lee en el navegador bajo su propia URL, el arreglo cumplió su cometido.