require
(y su primo load
) son métodos básicos de Ruby. require_dependency
es un método que ayuda a Rails a manejar el problema de la administración de dependencias. Para abreviar, le permite a Rails volver a cargar clases en modo de desarrollo para que no tenga que reiniciar el servidor cada vez que haga un cambio de código. El marco de Rails require_dependency
su código para que pueda rastrearlo y volver a cargarlo cuando se realicen cambios. El estándar Ruby require
no hace eso. Como desarrollador de aplicaciones (o complementos/motores) no debería preocuparse por require_dependency
ya que esto es puramente interno de Rails.
La magia del proceso de carga de la clase Rails se encuentra en el módulo ActiveSupport :: Dependencies. Este código amplía el comportamiento predeterminado de Ruby para permitir que el código dentro de la aplicación Rails cargue módulos automáticamente (incluidas las clases que heredan del Módulo) usando la ruta de Rails y las convenciones de nomenclatura de archivos. Esto elimina la necesidad de que el programador ensucie su código con llamadas require
como lo haría en una aplicación simple de Ruby.
para decirlo de otra manera, esto le permite definir class Admin::User
dentro del archivo app/models/admin/user.rb
y tienen rieles saben lo que está hablando cuando se llama Admin::User.new
de otra parte de la aplicación como un controlador. Sin ActiveSupport :: Dependencias involucradas, tendría que manualmente require
todo lo que necesitara.
Si vienes de un lenguaje estáticamente tipado como C#, Java, etc., esto podría ser una sorpresa: el código de Rails no se carga hasta que se necesita. Por ejemplo, una clase de modelo User
no está definida y user.rb
no se carga hasta DESPUÉS de intentar llamar al User.whatever_method_here
. Rails evita que Ruby se queje de la constante que falta, carga el código para User
, y luego permite que Ruby continúe con normalidad.
Si bien no puedo hablar por su necesidad específica, me sorprendería mucho si realmente necesitara usar el método require_dependency
desde un plugin o motor. Si sigues las convenciones de Rails, tampoco deberías tener que ajustar $ LOAD_PATH manualmente. Este no es "el camino de Rails".
En el mundo de Ruby y también Rails, la simplicidad y la claridad son la clave. Si todo lo que quiere hacer es escribir un plugin o un motor y ya está sumergiéndose en el interior, entonces puede considerar abordar su problema desde un ángulo diferente. Mi instinto me dice que puedes estar tratando de hacer algo innecesariamente complicado. Pero, de nuevo, ¡no tengo idea de lo que estás haciendo exactamente! :)
FYI: La recarga de clases se realiza automáticamente en los motores (que son nada más que con los plugins de aplicaciones/carpetas), al igual que lo están en las aplicaciones normales. –
Gracias, sí, soy consciente de eso. Pero esto lleva a mi otra pregunta: ¿Puedo usar otros complementos dentro de mi complemento? Digamos, quiero usar un plugin act_as_xxx en mi propio complemento, ¿puedo poner el act_as_xxx dentro del directorio de proveedores/complementos de mi complemento y luego agregar la ruta a $ LOAD_PATH? Supongo que debería preguntar esto en otro hilo, sin embargo, no está relacionado con mi pregunta original. – wei