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


Respuestas:


166

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

 load './path/to/foo.rb'

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.


¡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


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.


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

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


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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.