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
El bug de normalización que solo aparece con etiquetas hechas de nada
Un normalizador basado en strip se topa con una etiqueta de puro signo de puntuación: string vacío como clave de hash, sustitución de etiqueta equivocada, y un autocompletado que hace match con todo. Tres síntomas, una sola causa raíz.
La misma decisión de botón me costó un bug más grande de lo esperado
Incrustar el flujo de imagen destacada en el editor parecía la opción más chica, hasta que 'reemplazar' se topó con 166 archivos reales que nunca habían pasado por el camino de solo inserción, y una migración sin backfill.
El botón de commit del editor es un botón de deploy
Confirmar un borrador a main despliega el blog automáticamente. En cuanto eso quedó claro, sync vs. async dejó de ser una cuestión de estilo, más el caso especial de afiliado heredado que un validador nuevo casi rompió.