2009-08-03 29 views
58

A partir de Rails 2.3, ¿cuál es la forma correcta de agregar un directorio a la ruta de carga para que se enganche en los mecanismos de recarga automática de Rails?¿Agregar un directorio a la ruta de carga en Rails?

El ejemplo específico en el que estoy pensando es que tengo una clase que tiene varias subclases que usan STI y pensé que sería una buena idea colocarlas en un subdirectorio en lugar de saturar el nivel superior. Así que me gustaría tener algo como:

#app/models/widget.rb 
class Widget < ActiveRecord::Base 
    add_to_load_path File.join(File.dirname(__FILE__), "widgets") 
end 

#app/models/widgets/bar_widget.rb 
class BarWidget < Widget 
end 

#app/models/widgets/foo_widget.rb 
class FooWidget < Widget 
end 

Es el método add_to_load_path que yo estoy buscando.

Respuesta

60

Para versiones anteriores de rieles:

Usted puede hacer esto en su archivo de configuración environment.rb.

config.load_paths << "#{RAILS_ROOT}/app/widgets" 

-

Para Rails 3, ver respuestas de abajo

+8

ActiveSupport :: Dependencies.autoload_paths << "# {RAILS_ROOT}/app/widgets" –

+1

Consulte la respuesta por pocket-full-of-quarters, que en realidad es correcta. Este ahora está desactualizado. – micapam

1

encontré que tenía que hacer esto después de config block-- no tienen acceso a objeto de configuración más.

Esto hizo el truco

ActiveSupport::Dependencies.load_paths << "#{RAILS_ROOT}/app/widgets" 
27

En Rails 3, se puede establecer esto en config/application.rb, en este ejemplo se proporciona de forma predeterminada:

# Add additional load paths for your own custom dirs 
# config.load_paths += %W(#{config.root}/extras) 
+13

# config.autoload_paths + =% W (# {} config.root/extras) – tamersalama

8

Otra actualización para los carriles 3 - ActiveSupport 3.0.0:

En lugar de:

ActiveSupport::Dependencies.load_paths << "#{RAILS_ROOT}/app/widgets" 

Es posible que tenga que hacer esto:

ActiveSupport::Dependencies.autoload_paths << "#{RAILS_ROOT}/app/widgets" 
+2

Rails.root es necesario en Rails 3 en lugar de RAILS_ROOT –

+0

rieles Bajo 3.0.3, tenía que usar ActiveSupport :: Dependencies.autoload_paths + =% W (# {Rails.root.to_s}/app/libs) –

101

En la versión actual de carriles (3.2.8), esto ha sido cambiado en el archivo application.rb.

El código está actualmente comentada como:

# Custom directories with classes and modules you want to be autoloadable. 
    # config.autoload_paths += %W(#{config.root}/extras) 

necesitará actualizar los autoload_paths valor. Intentar modificar la antigua variable load_paths provoca este error.

/configuration.rb:85:in `method_missing': undefined method `load_paths' for #<Rails::Application::Configuration:0xac670b4> (NoMethodError) 

para un ejemplo, para cada ruta de acceso a añadir a autoload_paths config, añadir una línea similar a la siguiente:

config.autoload_paths += %W(#{config.root}/app/validators) 

config.autoload_paths acepta una matriz de caminos de la cual Carriles constantes voluntad de autocarga . El valor predeterminado es todos los directorios en app.

http://guides.rubyonrails.org/configuring.html


De commentor (hakunin) a continuación:

Si el directorio está bajo app/, no es necesario añadir en cualquier lugar, sólo se debe trabajar de forma predeterminada (en duda 3.2.12). Rails tiene eager_load_paths que actúa como autoload_paths en desarrollo y carga ansiosa en producción. Todos los directorios app/* se agregan automáticamente allí.

+1

Está respondiendo una pregunta de hace 3 años, y los rieles 3 no existían cuando se formuló esta pregunta – Bassetassen

+78

Bro, ya conoce el motor de búsqueda Google, enumera los resultados de búsqueda de 3 años, todo el tiempo. ¿No sería bueno si el resultado de 3 años pudiera responder a su pregunta y finalizar su búsqueda antes? –

+0

Por supuesto, pero esta pregunta ya tiene una respuesta aceptada, por lo que el interlocutor ya obtuvo una respuesta a su pregunta. – Bassetassen

8

En Los Carriles 5 es necesario añadir el siguiente código a environment.rb:

# Add the widgets folder to the autoload path 
Rails.application.configure do 
    config.autoload_paths << "#{Rails.root}/app/widgets" 
end 
+1

Rails 5 realmente autocarga todas las carpetas en el directorio de la aplicación. –

+0

Gracias. Este fue el comportamiento predeterminado la última vez que lo verifiqué, pero la verdad es que no recuerdo si fue un problema de producción único como el que se indica aquí: http://blog.bigbinary.com/2016/08/29/rails-5-disables -autoloading-after-booting-the-app-in-production.html –

7

En rieles 5 que no tiene que cargar explícitamente carpetas desde dentro del directorio de aplicaciones más. Todas las carpetas colocadas dentro están directamente disponibles. No tiene que tocar ninguno de los archivos de configuración. Pero parece que hay algunos problemas con Spring. Por lo tanto,

El nuevo flujo de trabajo es:

  1. crear una nueva carpeta y de clase dentro del directorio/app
  2. plazo spring stop en la línea de comandos
  3. verificación de los autocarga-caminos con bin/rails r 'puts ActiveSupport::Dependencies.autoload_paths' en la línea de comandos . La nueva carpeta ahora debe aparecer en la lista.
  4. plazo spring start en la línea de comandos
+0

Estoy encontrando que esta no es confiable y nunca tuve la primavera instalada o en mi gemfile (cuando se ejecutó). Al decir poco fiable, me refiero a que el código de puesto encuentra el directorio, pero ninguno de los archivos que contiene se carga para incluirlo en otro lugar. Incluir clases funciona para mí cuando coloco el autoload_path en config/application.rb en su lugar. – Mirv

+0

@Mirv - ¿qué versión de rieles estás? y eche un vistazo a: http://guides.rubyonrails.org/autoloading_and_reloading_constants.html#autoload-paths –

+0

Sí, lo leí y luego probé en los raíles 5.0.0 y 5.1.0 en el IDE de cloud9. Aparentemente no se maneja como cambios normales en los archivos al ejecutar 'carriles s', pero en su lugar tengo que' recargar' mientras esté en 'carriles c', que no se menciona en 3 secciones más de la documentación. Volví y comprobé, en este momento, como representa mi proyecto: tengo que agregar manualmente el archivo a pesar de que está ubicado en app/classes/filler.rb mientras uso 'rails c' ... Incluso reinicié el espacio de trabajo, aunque No he comenzado un proyecto completamente nuevo. – Mirv

2

En config/application.rb añadir config.autoload_path << "#{config.root}/dir/widgets"

del archivo debe tener este aspecto:

module MyApp 
    class Application < Rails::Application 
    config.autoload_paths << "config.root}/widgets" 
    end 
end 

Sé que esto funciona para los carriles 4 y 5. Probablemente otros también .

Cuestiones relacionadas