Gestire upload di file (avatar, allegati, immagini) a mano è tedioso. Active Storage lo fa per te con una riga nel model.
class Provider < ApplicationRecord
has_one_attached :logo
end
# nel controller
provider.logo.attach(params[:logo])
# nella view
<%= image_tag provider.logo.variant(resize_to_limit: [200, 200]) %>
has_one_attached (o has_many_attached) collega i file al model. Active Storage salva i metadati nel database e il file vero dove vuoi: disco in sviluppo, poi S3, Google Cloud o Azure in produzione, cambiando solo la configurazione.
La chicca sono le varianti: variant(resize_to_limit: [200, 200]) genera al volo una versione ridimensionata dell'immagine (serve la libreria di image processing), e la memorizza per le volte successive.
Niente più codice di upload custom, niente gestione manuale dei percorsi. Ti concentri sul dominio, Active Storage si occupa dei bit. Dallo sviluppo locale al cloud, senza cambiare una riga del model.