Pasar el archivo de secuencia de comandos ruby ​​a la consola de Rails

117

¿Hay alguna forma 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 cualquier otra forma que me permita ejecutar un archivo en un entorno de rieles, activado desde el símbolo del sistema.

Haris Krajina
fuente

Respuestas:

166

En realidad, la forma más sencilla es ejecutarlo con el loadinterior delrails console

 load './path/to/foo.rb'
Adrian
fuente
5
Esto funciona muy bien. Pero a menos que esté haciendo algo mal, no tienes acceso a los objetos creados dentro del script. ¿Alguna forma de hacer esto? El caso de uso es configurar algunos objetos y luego explorarlos de forma interactiva. ¿Es eso posible?
Dan Barron
1
@DanBarron puede poner en un depurador o binding.pry
concesión
Esto es como un Lisp REPL +1
zeitue
Noob help: ./path - es la ruta relativa a su proyecto de rieles donde reside su archivo.
Darpan
87

Puedes usar

bundle exec rails runner "eval(File.read 'your_script.rb')"

ACTUALIZAR:

Lo que también hemos estado usando mucho últimamente es cargar el entorno de rails desde el propio script. Considere doit.rb:

#!/usr/bin/env ruby

require "/path/to/rails_app/config/environment"

# ... do your stuff

Esto también funciona si el script o el directorio de trabajo actual no están dentro del directorio de la aplicación rails.

Moritz
fuente
¡Muchas gracias por hacer un trabajo! Estoy usando Sublime Text 2, así que ahora podré activar compilaciones de clases de rieles y ver la salida directamente en IDE :)
Haris Krajina
2
script / runner "eval (File.read 'your_script.rb')" para rieles 2.3 :)
valk
2
puede usar un patrón similar para ejecutar archivos dentro de la consola: f=File.new('path/to/file')para ejecutar use:f.rewind; eval f.readlines.join("\n");
semiomant
3
Para su información, ya no necesita la eval(File.read ...)pieza. Rails acepta un archivo Ruby como argumento para rails runner:Usage: rails runner [options] [<'Some.ruby(code)'> | <filename.rb>]
Ajedi32
Actualización: según la respuesta de @ HarisKrajina a continuación, parece que rails r path/to/filename.rbes funcionalmente equivalente al bundle exec rails runnercomando mencionado anteriormente.
Richie Thomas
61

Mientras tanto, se ha apoyado esta solución.

rails r PATH_TO_RUBY_FILE

Mucho más simple ahora.

Haris Krajina
fuente
¿en qué versiones de Rails?
karatedog
1
Creo que 3+, puedo confirmar para 5.
Haris Krajina
4
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.

hari seldon
fuente
4

Considere la posibilidad de crear una tarea de rastrillo.

Para el código que necesito para crear registros o 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
end

Y luego en la terminal ejecuta:

rake example:create_user
Mate
fuente
1

De estos enfoques mencionados anteriormente, ninguno parecía limpio e ideal, como esperaría que se ejecutara un script independiente (no se evalúe o se canalice a través de <redirección), pero finalmente esto funciona perfecto para mí:

(para rieles 3)

Inserte 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 esa manera, puedo evitar tener que ingresar a cualquier interactivo irbo rails cy puedo probar mi script.rb desde el indicador de shell, antes, por ejemplo. programarlo en crontab.

También admite sin problemas los parámetros de la línea de comandos y minimiza los niveles de envoltorios antes de acceder a su 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

Marcos
fuente
0

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 File.reades la raíz del proyecto Rails.

Sé que esto es una herejía seria, usar Python para ayudar a un script ruby. Pero no pude encontrar un relpathmétodo integrado en ruby.

Crédito: relpath()fue tomado de @MestreLion, Convertir ruta absoluta en ruta relativa dado un directorio actual usando Bash

Chaim Leib Halbert
fuente