ruby on rails 3 - rails - Pase el archivo de script de ruby a la consola de rieles
ruby on rails que es (7)
Aquí está el truco que estoy usando:
rr() {
rails_root="$(bundle exec rails runner "puts Rails.root")"
rp="$(relpath "$1" "$rails_root")"
bundle exec rails runner "eval(File.read ''$rp'')"
}
relpath() {python -c "import os.path; print os.path.relpath(''$1'',''${2:-$PWD}'')";}
Ejemplo:
cd ~/rails_project/app/helpers
rr my_script.rb
Basado en la respuesta de @moritz aquí. Lo cambié, ya que el directorio de trabajo para File.read
es la raíz del proyecto Rails.
Sé que esto es una herejía grave, el uso de Python para ayudar a un guión de rubí. Pero no pude encontrar un método relpath
integrado en ruby.
Crédito: relpath()
fue tomado de @MestreLion, convierte la ruta absoluta en una ruta relativa dado un directorio actual usando Bash
¿Hay alguna manera de pasar el archivo ruby, foo.rb a la consola de rieles? Los resultados esperados serían después de que la consola inicie el entorno de rieles para ejecutar el archivo.
O de cualquier otra manera que me permita ejecutar el archivo en el entorno de los rieles, desencadenado desde el símbolo del sistema.
Considera crear una tarea de rake.
Para el código que necesito para crear registros o para admitir migraciones, por ejemplo, a menudo creo una tarea de rake como esa a partir de esta respuesta . Por ejemplo:
En lib/tasks/example.rake
:
namespace :example do
desc "Sample description you''d see if you ran: ''rake --tasks'' in the terminal"
task create_user: :environment do
User.create! first_name: "Foo", last_name: "Bar"
end
Y luego en la carrera terminal:
rake example:create_user
De estos enfoques mencionados anteriormente, ninguno parecía limpio e ideal, como es de esperar que se ejecute un script independiente (no se evalúa o canaliza a través de <redirección), pero finalmente esto funciona perfecto para mí:
(para Rails 3)
Insertar en la parte superior de su secuencia de comandos:
#!/usr/bin/env ruby
APP_PATH = File.expand_path(appdir = ''/srv/staging/strat/fundmgr/config/application'', __FILE__)
require File.expand_path(appdir + ''/../boot'', __FILE__)
require APP_PATH
# set Rails.env here if desired
Rails.application.require_environment!
# your code here...
Por supuesto, configure su propia ruta de la aplicación Rails en la línea APP_PATH.
De esta forma, puedo evitar tener que ingresar cualquier irb
o rails c
interactivo y puedo probar mi script.rb desde el intérprete de comandos del shell, antes p. Ej. programando en crontab.
También admite parámetros de línea de comandos y minimiza los niveles de envoltorios antes de llegar a tu código.
CRÉDITO (también muestra un ejemplo de Rails 2)
http://zerowidth.com/2011/03/18/standalone-script-runner-bin-scripts-in-rails.html
Mientras tanto, esta solución ha sido respaldada.
rails r PATH_TO_RUBY_FILE
Mucho más simple ahora.
Puedes usar
bundle exec rails runner "eval(File.read ''your_script.rb'')"
ACTUALIZAR:
Lo que también hemos estado utilizando mucho últimamente es cargar el entorno de los rieles desde el propio guión. Considera doit.rb
:
#!/usr/bin/env ruby
require "/path/to/rails_app/config/environment"
# ... do your stuff
En realidad, la forma más simple es ejecutarlo con load
dentro de la rails console
load ''./path/to/foo.rb''
script/console --irb=pry < test.rb > test.log
simple, sucio y bloquea el proceso al final, pero hace el trabajo exactamente como yo quería.