2012-02-16 8 views
7

Tengo problemas para nombrar un módulo que incluyo en un modelo.Módulos y rails espaciados por nombres 3.1.3 autoload_path

en /app/models/car.rb

class Car 
include Search::Car 
end 

en /lib/search/car.rb

module Search 
    module Car 
    include ActiveSupport::Concern 
    # methods in here 
    end 
end 

en /config/application.rb

config.autoload_paths += Dir["#{config.root}/lib/**/"] 
config.autoload_paths += Dir["#{config.root}/lib/search/*"] 

Lo extraño es que no recibo ningún error directamente cuando enciendo el servidor. Pero si actualizar el navegador después de un tiempo me sale este error:

Expected #{Rails.root}/lib/search/car.rb to define Car 

La naturaleza del problema indica que tiene algo que ver con:

/config/environments/development.rb

config.cache_classes = false 

también intenté poner un archivo directamente en search.rb/lib donde defino Search:

module Search 
    # Put shared methods here 
end 

¿Qué estoy haciendo mal?

ACTUALIZACIÓN:

Ok, resulta que si cambio el nombre de Search::Car-Search::CarSearch funciona. ¿No es posible tener Módulos/Clases del mismo nombre en un ámbito diferente?

+0

Usted puede tener módulos/Clases del mismo nombre en diferentes ámbitos, pero luego cuando se utiliza los métodos módulo de coches, debe especificar el alcance para eliminar la ambigüedad. –

+0

Oye, gracias por tu comentario. Yo también lo pensé, pero parece que no funciona. ¿Alguna idea de por qué me sale el error? – Yeggeps

Respuesta

4

El error proviene de tus rutas_autoload. config.autoload_paths += Dir["#{config.root}/lib/**/"] agregará todos los directorios y sus subdirectorios en el directorio lib. lo que significa que le está diciendo a los rieles que carguen automáticamente lib/search/directory, por lo tanto se espera que car.rb bajo ese directorio defina Car y no Search :: Car. Para que los rieles esperen que lib/search/car.rb defina Search :: Car, debe cargar automáticamente lib/directory y no lib/search. Si cambia de carga automática a config.autoload_paths += Dir["#{config.root}/lib/"] y poner search.rb en lib/con el siguiente código:

module Search 
    require 'search/car' 
end 

continuación rieles entenderán y esperar lib/Búsqueda/car.rb no definen Buscar :: coche y hacer referencia módulo de Coche/clase en otros lugares de su código no hará referencia a este car.rb.

Debe eliminar esta línea (sólo se debe tener carga automática para el directorio lib): config.autoload_paths += Dir["#{config.root}/lib/search/*"]

Cuestiones relacionadas