2012-04-25 9 views
80

¿Hay alguna manera de pasar el archivo de 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.Pase el archivo de script de ruby ​​a la consola de rieles

O de cualquier otra manera que me permita ejecutar archivos en el entorno de rieles, desencadenado desde el símbolo del sistema.

+0

duplicado posible de [¿Cómo se ejecuta un archivo de Ruby en un entorno de Rails?] (Http: //stackoverflow.com/questions/9757261/how-do-i-run-a-ruby-file-in-a-rails-environment) –

Respuesta

17

Mientras tanto, esta solución ha sido apoyado.

rails r PATH_TO_RUBY_FILE 

Mucho más simple ahora.

72

Puede utilizar

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

ACTUALIZACIÓN:

Lo que también hemos estado utilizando mucho últimamente es cargar el medio ambiente carriles desde dentro de la propia secuencia de comandos. Considere doit.rb:

#!/usr/bin/env ruby 

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

# ... do your stuff 
+0

¡Muchas gracias por su trabajo! Estoy usando Sublime Text 2, así que ahora podré desencadenar compilaciones de clases de rieles y ver la salida directamente en IDE :) –

+2

script/runner "eval (File.read 'your_script.rb')" para rails 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

4
script/console --irb=pry <test.rb> test.log 

simple, sucio, y bloquear el proceso al final, pero hace el trabajo exactamente como yo quería.

123

En realidad, la forma más sencilla es ejecutar con load dentro del rails console

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

Esto funciona genial. Pero a menos que esté haciendo algo mal, no tienes acceso a objetos creados dentro del script. ¿Alguna forma de hacer esto? El caso de uso es configurar algunos objetos y luego explorarlos interactivamente. ¿Es eso posible? –

+0

Tan fácil. Gracias. – Abram

+0

@DanBarron puedes poner un depurador o binding.pry – grant

1

De estos enfoques mencionados anteriormente, ninguno parecía limpio e ideal como es de esperar un proceso independiente para funcionar (no conseguir eva- ed o canalizado a través de < redirección), pero finalmente esto funciona perfecto para mí:

(por carriles 3)

Insertar en la parte superior de la 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, establezca su propia ruta de la aplicación Rails en la línea APP_PATH.

De esa manera, puedo evitar tener que introducir ningún irb interactivo o rails c y puedo probar mi script.rb desde el intérprete de comandos, por ejemplo antes. programando en crontab.

Soporta sin problemas parámetros de línea de comandos, también, y minimiza los niveles de envoltorios antes de llegar a su código.

CRÉDITO (también muestra un ejemplo 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 @ Moritz de responde 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, usando Python para ayudar a un script de ruby. Pero no pude encontrar un método relpath integrado en ruby.

Crédito: relpath() fue tomada desde @MestreLion, Convert absolute path into relative path given a current directory using Bash

1

Considere 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 la de this answer. 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 el terminal ejecutar:

rake example:create_user 
Cuestiones relacionadas