Upload Progress met Rails en Mongrel

Gepubliceerd op: 14.X.2008 22:02 CEST
Categorieën: javascript, mongrel, plugin, rails

Upload progress is lastig; aan de server kant bijhouden wat de voortgang is en gerommel met JavaScript om dat dan weer aan de gebruiker te kunnen tonen. Eigenlijk zou een browser dit zelf voor je moeten doen — bij een download kan ik toch ook zien hoe ver ik ben — maar helaas is de realiteit anders. Gebruikers van je applicaties opschepen met een “hangende” browsers als zij een paar fototjes uploaden is natuurlijk geen optie.

Gelukkig ben ik niet de enige met dit probleem en kan ik, omdat ik mijn applicaties met Mongrel deploy, gebruik maken van de Mongrel Upload Progress plugin. Vol enthousiasme heb ik me dan ook op deze plugin gestort maar heb na het lezen van de instructies met een vies gezicht een stapje terug genomen.

De Mongrel Upload Progress plugin is, tja hoe moet ik dit vriendelijk verwoorden, uhm, lastig te gebruiken. Het vereist een hoop geknip en plak van een wiki pagina, aanpassingen in je controllers en als je ook nog eens een cluster mongrels draait, moet je een DRb process gaan draaien?! Dat allemaal omdat ik een paar formulieren heb waarbij je een bestand kan uploaden..

Met de Mongrel Upload Progress plugin als referentie materiaal heb ik daarom zelf een oplossing geïmplementeerd. Het resultaat was bevredigend genoeg om een plugin van te bakken en de Unobtrusive Upload Progress plugin was geboren. Ik weet het, de naam laat wat te wensen over — “unobtrusive” is het “interactief” of “multi channel” van tegenwoordig — maar ik hoop dat ik een echt unobtrusive oplossing heb gemaakt.

  • formulieren worden automatisch voorzien van extra event handlers als er een upload veld in zit
  • als de gebruiker geen JavaScript aan heeft staan, werken de formulieren als voorheen
  • controllers hoeven niet aangepast te worden
  • bij validatie fouten in je formulier wordt het formulier netjes opnieuw getoond
  • als de Mongrel handlers niet geladen zijn, wordt de JavaScript library ook niet geladen
  • geen configuratie verschil als je een enkel Mongrel process gebruikt of een cluster

Installatie instructies kan je vinden in de README.