Si alguna vez has revisado tus logs de producción y los has encontrado asfixiados con errores ActionController::RoutingError (No route matches [GET] '/favicon.ico'), tu configuración de ruby on rails favicon tiene fugas. Los navegadores son agresivamente tercos. Buscarán esa ruta de archivo exacta en la raíz de tu dominio en cada visita, independientemente de lo que dicte tu cabecera HTML.

Mira a GitHub, posiblemente la aplicación Rails más famosa que existe. Utilizan iconos SVG dinámicos para mostrar insignias de notificación en la pestaña del navegador. Sin embargo, si inspeccionas su tráfico de red, todavía mantienen un archivo .ico codificado en la raíz de su dominio. Lo hacen simplemente para satisfacer a los rastreadores web tontos y a los navegadores heredados que ignoran las etiquetas HTML modernas.

La comunidad Rails a menudo discute sobre si poner los iconos en la carpeta public o pasarlos por el Asset Pipeline. ¿Mi postura? Debes hacer ambas cosas. Depender únicamente de los view helpers de Rails te deja vulnerable a los errores 404 del tráfico de bots. Depender únicamente de la carpeta public estática te roba las huellas digitales que rompen la caché (cache-busting) cuando cambias de marca. Necesitamos un enfoque híbrido.

La Estrategia Híbrida de Favicon en Rails

Configurar esto correctamente requiere dividir tus activos. Alimentaremos a los bots heredados exactamente con lo que quieren, mientras servimos activos modernos y con caché renovada a los usuarios reales.

Paso 1: Silenciar las Peticiones a la Raíz

Primero, toma tu archivo favicon.ico base. Si no tienes uno, genéralo usando Mzu favicondl. Suelta este archivo directamente en tu directorio public/ de Rails. No lo pongas en app/assets.

La carpeta public es servida directamente por Puma (o Nginx/Caddy en producción) sin llegar nunca al enrutador de Rails. Esto detiene instantáneamente los errores de enrutamiento. Actúa como un respaldo silencioso para herramientas como lectores RSS o versiones antiguas de Internet Explorer.

Paso 2: Integración con el Asset Pipeline

A continuación, manejamos la web moderna. Necesitas un SVG para los navegadores modernos y un Apple Touch Icon para los dispositivos iOS. Estos pertenecen a app/assets/images/.

¿Por qué? Porque Rails (ya sea que uses Propshaft o el antiguo Sprockets en 2026) añadirá un hash único al nombre del archivo durante la precompilación de activos. Cuando tu equipo de marketing decida ajustar el color de fondo del logo, el nombre del archivo compilado cambiará (por ejemplo, icon-a1b2c3d4.svg). Esto rompe instantáneamente la caché del navegador, asegurando que los usuarios recurrentes vean el nuevo logo de inmediato.

Paso 3: Escribir los Helpers ERB

Abre tu archivo app/views/layouts/application.html.erb. Rails proporciona un helper incorporado favicon_link_tag, pero necesitamos configurarlo explícitamente para evitar que haga suposiciones incorrectas sobre los tipos de archivo.

<head>
  <!-- Respaldo base para navegadores que ignoran la carpeta public -->
  <%= favicon_link_tag 'favicon.ico' %>

  <!-- SVG moderno con soporte para modo oscuro -->
  <%= favicon_link_tag 'icon.svg', rel: 'icon', type: 'image/svg+xml' %>

  <!-- Apple Touch Icon para pantallas de inicio de iOS -->
  <%= favicon_link_tag 'apple-touch-icon.png', rel: 'apple-touch-icon', type: 'image/png' %>
</head>

Nota que definimos explícitamente los atributos rel y type para los formatos modernos. Si los omites, Rails por defecto usa rel='icon' type='image/x-icon', lo cual de hecho rompe el renderizado SVG en navegadores estrictos como Chrome.

Paso 4: Manejo de Web App Manifests en Rails

Si estás construyendo una Progressive Web App (PWA), necesitas un archivo manifest.json. ¿El problema? Un archivo JSON estático en la carpeta public no puede referenciar tus imágenes del asset pipeline que tienen huella digital.

La solución es enrutar tu manifiesto a través de Rails. Crea un archivo en app/views/pwa/manifest.json.erb y usa el helper image_path:

{
  "name": "Mi App Rails",
  "icons": [
    {
      "src": "<%= image_path('icon-512.png') %>",
      "sizes": "512x512",
      "type": "image/png"
    }
  ]
}

Esto asegura que tus usuarios de Android siempre obtengan el icono correcto y con la caché actualizada cuando instalen tu aplicación en su pantalla de inicio.

Errores Comunes en Producción

Configurar esto localmente suele tomar cinco minutos, pero depurar un despliegue roto puede tomar horas. Aquí está lo que usualmente sale mal cuando subes a producción.

Hacer bien tu ruby on rails favicon se trata de entender el equilibrio entre archivos estáticos y activos compilados. Pon el archivo heredado en la raíz, deja que el asset pipeline maneje los formatos modernos, y usa los helpers incorporados para unirlo todo. Si estás cansado de ver errores 404 de favicon en tus logs, este enfoque híbrido lo soluciona permanentemente. ¿Necesitas generar los tamaños exactos para tu carpeta app/assets? Revisa nuestra guía de tamaños de Apple Touch Icon para evitar inflar tu repositorio.