10.lines do: Helpers bajo demanda en Rails

01.03.2010 0

Dentro de los objetivos en uno de nuestros desarrollos en Rails está el tener cuantas más vías mejor a la hora de personalizar la aplicación de cara al cliente. En una de esas últimas incursiones en la carga dinámica para cada cliente estuvimos jugando con el tema de que pudieran tener helpers propios.

Imaginemos que dentro de config/preinitializer.rb tenemos algo como esto:

NUESTRO_CLIENTE = 'foobar'

Podemos crear un fichero llamado config/initializers/helper_loader.rb (el nombre es un poco lo de menos), que contenga lo siguiente:

helper_load_path = File.join(RAILS_ROOT, 'app', 'customizations', NUESTRO_CLIENTE, 'helpers')
ActiveSupport::Dependencies.load_paths << helper_load_path

Por último, creamos un fichero llamado app/customizations/foobar/helpers/foobar_helper.rb parecido al siguiente:

module FoobarHelper
  def nuestro_metodo
    # lo que sea
  end
end

Ya solo nos quedaría meter en nuestro app/controllers/application_controller.rb la siguiente línea:

helper Module.const_get("#{NUESTRO_CLIENTE.titleize}Helper")

Con esto ya tendríamos disponible el helper nuestro_metodo solo en aquellas instancias en las que NUESTRO_CLIENTE fuese foobar y no en el resto. O también nos podría servir para poder definir en varias instancias de manera completamente distinta nuestro_metodo (por ejemplo, definir un ad_tag_helper que para un cliente estuviese optimizada para SmartAdServer, para otro con OpenX, para otro con Google Adsense…).

Las posibilidades que nos brinda estas pocas líneas son infinitas :)

Sin comentarios

Envía tu comentario