Si escribe script/console
en su proyecto Rails y entra $:
, obtendrá una matriz que incluye todos los directorios necesarios para cargar Ruby. La conclusión de este pequeño ejercicio es que $:
es una matriz. Siendo así, puede realizar funciones en él como anteponer otros directorios con el método unshift
o el operador <<
. Como dijiste en tu declaración, $:
y $LOAD_PATH
son lo mismo.
La desventaja de hacerlo de la manera rápida y sucia como mencionó es esto: si ya tiene el directorio en su ruta de inicio, se repetirá.
Ejemplo:
tengo un plugin que creé llamado TODO. Mi directorio está estructurado así:
/---vendor
|
|---/plugins
|
|---/todo
|
|---/lib
|
|---/app
|
|---/models
|---/controllers
|
|---/rails
|
|---init.rb
En el archivo init.rb entré en el siguiente código:
## In vendor/plugins/todo/rails/init.rb
%w{ models controllers models }.each do |dir|
path = File.expand_path(File.join(File.dirname(__FILE__), '../lib', 'app', dir))
$LOAD_PATH << path
ActiveSupport::Dependencies.load_paths << path
ActiveSupport::Dependencies.load_once_paths.delete(path)
end
Nota cómo le digo al bloque de código para realizar las acciones dentro del bloque a las cuerdas 'modelos', 'controladores' y 'modelos', donde repito 'modelos'. (FYI, %w{ ... }
es solo otra manera de decirle a Ruby que mantenga una variedad de cadenas). Cuando corro script/console
, escribo lo siguiente:
>> puts $:
Y escribo esto para que sea más fácil de leer el contenido de la cadena. La salida que recibo es:
...
...
./Users/Me/mySites/myRailsApp/vendor/plugins/todo/lib/app/models
./Users/Me/mySites/myRailsApp/vendor/plugins/todo/lib/app/controllers
./Users/Me/mySites/myRailsApp/vendor/plugins/todo/lib/app/models
Como se puede ver, aunque esto es tan simple un ejemplo que podría crear mientras se utiliza un proyecto que estoy trabajando actualmente, si no se tiene cuidado la manera rápida y sucia conducirá a caminos repetidos. La forma más larga verificará las rutas repetidas y se asegurará de que no ocurran.
Si usted es un programador experimentado rieles, es probable que tenga una muy buena idea de lo que está haciendo y es probable que no cometa el error de repetir caminos. Si eres un novato, iría por el camino más largo hasta que entiendas realmente lo que estás haciendo.
A ** ** ligeramente versión menos detallado de la prolija es:. 'File.expand_path (File.dirname (__ __ ARCHIVO)) pulse {| pwd | $ LOAD_PATH.unshift (PWD) a menos que $ LOAD_PATH.include? (PWD)} ' –
¿qué hay de la cláusula "salvo"? ¿Cómo pueden los dos anteriores ser equivalentes? – inger
Como alguien que vino aquí para tratar de entender cómo usar esto, es súper críptico. No veo de dónde viene el nombre del directorio en los ejemplos. Agradecería si alguien pudiera aclarar esto. – SlySherZ