2012-07-18 11 views
9

¿Es la convención de ruby ​​que todos los archivos estén en un módulo con la estructura de carpetas (similar a los paquetes de Java)?¿Deberían todos los archivos ruby ​​tener una estructura de módulo que coincida con la estructura de la carpeta?

Por ejemplo, si tengo una estructura de archivos que se parece a

lib/personas/utils

haría con los archivos aquí tienen la estructura del módulo, tales como:

module People 
    module Utils 
    # some functionality for People::Utils 
    end 
end  

La razón Lo pregunto es porque he estado leyendo el código de algunos rieles, y parece haber varios archivos que están en una estructura de archivos como esta, pero no tienen ninguna declaración de módulo.

Supongo que esto sería para que pueda usar la función de utilidad sin tener que incluir People::Utils.

¿Existe una convención en ruby ​​acerca de cuándo se deben usar los módulos y cuándo no?

Respuesta

4

En general, es una buena idea poner clases y archivos en una estructura como esa, porque facilitará a las personas asignar el nombre de la clase a su definición.

Pero puede tener sentido no hacerlo (en última instancia, estructure el código como prefiera). Ocasionalmente lo hice cuando había muchas clases pequeñas que trataban sobre lo mismo, las puse juntas.

Y puede tener sentido tener un archivo que no define un módulo o clase, p. un archivo de configuración, o un archivo binario, o un archivo de arranque (archivo que carga todos los demás).

12

Es el estándar en Rails. La forma en que Rails carga tus modelos es mirando la estructura de la carpeta para adivinar dónde están las clases. Tenemos el llamado autoload_paths.

Puede encontrarlos llamando en su rails console (esto es un poco hacky, puede haber una manera más fácil para mostrarles):

app.instance_variable_get(:"@app").instance_variable_get(:"@_all_autoload_paths") 

Una salida aplicación por defecto rieles, sin config.autoload_paths += %W(#{config.root}/lib) en su config/application.rb config bloque se vería así:

["/Users/lunks/Code/rsvp/app/assets", 
"/Users/lunks/Code/rsvp/app/controllers", 
"/Users/lunks/Code/rsvp/app/helpers", 
"/Users/lunks/Code/rsvp/app/mailers", 
"/Users/lunks/Code/rsvp/app/models"] 

por lo tanto, si usted tiene app/models/something/util.rb y se llama a Something::Util en alguna parte, que se verá en estos caminos, buscar la carpeta con 01 y carga esto.

Ruby, por otro lado, no se preocupa por eso. Autoload en Ruby simple funciona como se describe en this page. Tendrás que usar Autoload o requerir los archivos directamente (y la estructura de la carpeta no significará nada).

+0

Y para listar autoload_paths en versiones posteriores de Rails: 'Rails.application.instance_variable_get (:" @_ all_autoload_paths ")' – valk

Cuestiones relacionadas