Old Emmanuel Oga's Weblog (new one is at www.emmanueloga.com)

Rails y require. O: ruby no encuentra mis required files!

Posted in Uncategorized by emmanueloga on septiembre 21, 2007

Rails inyecta buena cantidad de “magia” a nuestros programas. Entre ellas se encuentra el uso de const_missing en Object, que hace toda clase de cosas locas, como pueden atestiguar abriendo el archivo #:nodoc:umentado dependencies.rb de la gem ActiveSupport.

El tema es que a veces tanta magia no es lo que yo quiero. El archivo que Rails va a buscar depende del nombre de clase que este faltando, completamente cualificado.

Ejemplo, si hago una referencia en mis programas al modulo todavia no requerido “Lindo”, y el nombre completamente cualificado de Lindo es ::Un::Modulo::Muy::Lindo, rails lo va a buscar a “/lib/un/modulo/muy/lindo.rb” Si… muchos directorios.

A veces no quiero clasificar mi codigo por jerarquia de modulos, quizas quiera agrupar mis archivos por otro criterio. A este respecto me resulta muy facil pasar por alto la magia de rails y utilizar algo como

require File.join(File.dirname(__FILE__), ‘nombre_archivo’)

obviamente, esto es mucho mas feo que un simple

require ‘nombre_archivo’

En teoria no haria falta toda aquella maquinaria de File.dirnames y joins, pero en la practica he encontrado que me ha solucionado problemas en mas de una ocasion. Pera simplificar un poco la tarea, cree un simple reemplazo para require:

# pass an array of directories and a final filename
def ar_require_relative *args
main= File.dirname(args.shift)
args.each { |arg| main= File.join(main, arg) }
require main
end

Ahora puedo requerir mis archivos relativos a la posicion “donde estoy parado”, con un simple:

ar_require_relative __FILE__, ‘directorio_que_agrupa_mis_files’, ‘otro_dir’, ‘nombre_archivo’
ar_require_relative __FILE__, ‘otro_file’

No es tan lindo como un simple require, pero si ruby no encuentra el archivo de otra forma, de esta manera lo hace siempre! Obviamente, __FILE__ es necesario siempre. Si hiciera referencia a __FILE__ desde el metodo, el valor de __FILE__ siempre seria el del archivo que contiene al metodo, algo que no es muy util.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: