ruby-on-rails ruby relative-path

ruby on rails - ¿Por qué la ruta relativa no funciona en Ruby?



ruby-on-rails relative-path (3)

Estoy empezando a aprender Ruby, una cosa que no entiendo, por qué el camino relativo para la directiva de requerimiento no funciona en ruby. Es algo que funciona casi en todos los lenguajes de script que ahora (JSP, PHP ...). Lo explico con un ejemplo real. Tengo una carpeta llamada formas que contiene 3 clases de formas , rectángulos y cuadrados . También tengo otro archivo test_shapes.rb desde donde llamo y pruebo mis clases. Cuando importo mis clases al archivo principal de esta manera:

require "./shape" require "./rectangle" require "./square"

Tengo error para los archivos no encontrados. Cuando incluyo el nombre de mi subcarpeta así:

require "./shapes/shape" require "./shapes/rectangle" require "./shapes/square"

El código está funcionando perfectamente. Porque especificé la ruta completa al directorio raíz del proyecto (creo que la carpeta lib). Cuando incluyo incluyo la ruta absoluta al disco duro, como esto:

require "#{File.dirname(__FILE__)}/shape" require "#{File.dirname(__FILE__)}/rectangle" require "#{File.dirname(__FILE__)}/square"

También está funcionando perfectamente.

Entonces, solo quiero una explicación si sé por qué el primer método de importación (la ruta relativa a la carpeta actual) no funciona.


Estás utilizando una ruta relativa. Y son relativos al lugar donde se ejecuta su script. En general es una mala idea. Debe usar cualquiera de las rutas absolutas, ya sea la ruta relativa al archivo exacto donde se ejecuta require

require File.expand_path("../shape", __FILE__)

PS: require_relative ve más lacónico


La ruta relativa se basa en el directorio de trabajo. Supongo que hay un archivo principal en el mismo directorio. Si ejecuta ruby ./shapes/main.rb en la raíz del proyecto, ruby ​​intente encontrar {project_root}/shape.rb , no {project_root}/shapes/shape.rb . No funciona

Necesitas usar require_relative como a continuación.

# {project_root}/shapes/main.rb require_relative ''./shape'' require_relative ''./rectangle'' require_relative ''./square''


require (nombre) → verdadero o falso Carga el nombre dado, devolviendo verdadero si es exitoso y falso si la función ya está cargada.

Si el nombre de archivo no se resuelve en una ruta absoluta, se buscará en los directorios listados en $ LOAD_PATH ($ :).

Si el nombre del archivo tiene la extensión ".rb", se carga como un archivo fuente; Si la extensión es ".so", ".o" o ".dll", o la extensión de biblioteca compartida predeterminada en la plataforma actual, Ruby carga la biblioteca compartida como una extensión de Ruby. De lo contrario, Ruby intenta agregar ".rb", ".so", etc. al nombre hasta que se encuentre. Si el archivo nombrado no se puede encontrar, se generará un LoadError.

Para las extensiones de Ruby, el nombre de archivo dado puede usar cualquier extensión de biblioteca compartida. Por ejemplo, en Linux, la extensión de socket es "socket.so" y requiere que "socket.dll" cargue la extensión de socket.

La ruta absoluta del archivo cargado se agrega a $ LOADED_FEATURES ($ "). Un archivo no se volverá a cargar si su ruta ya aparece en $". Por ejemplo, requiere ''a''; require ''./a'' no cargará a.rb nuevamente.

requiera "my-library.rb" requiera "db-driver" Todas las constantes o globales dentro del archivo fuente cargado estarán disponibles en el espacio de nombres global del programa que llama. Sin embargo, las variables locales no se propagarán al entorno de carga.

require_relative (cadena) → verdadero o falso Ruby intenta cargar la biblioteca denominada cadena en relación con la ruta del archivo requerido. Si no se puede determinar la ruta del archivo, se genera un LoadError. Si un archivo está cargado se devuelve verdadero y falso en caso contrario.

Ref: http://ruby-doc.org/core-2.1.2/Kernel.html#require-method