¿Cómo ejecuto un archivo Ruby en un entorno Rails?

106

Quiero ejecutar un archivo Ruby en el contexto de un entorno Rails. rails runner casi hace lo que quiero hacer, pero me gustaría darle el nombre del archivo y los argumentos. Estoy bastante seguro de que esto es posible ya que lo he hecho antes. ¿Alguien puede recordarme cómo hacer esto?

weicool
fuente

Respuestas:

36

Simplemente requiera environment.rben su script. Si su script se encuentra en el scriptdirectorio de su aplicación Rails, haga

require File.expand_path('../../config/environment', __FILE__)

Puede controlar el entorno utilizado (desarrollo / prueba / producción) configurando la RAILS_ENVvariable de entorno al ejecutar el script.

RAILS_ENV=production ruby script/test.rb
iltempo
fuente
Si ejecuto el código anterior, aparecerá "home / apps / config / environment". ¿Qué pasa si tengo una aplicación de 2 rieles ejecutándose en el mismo directorio? ¿Qué entorno tomará? Estoy enfrentando este problema en mi caja local. sugiera amablemente
Vijay Sali
@VijaySali Supongo que está ejecutando su script desde el app/scriptdirectorio. El archivo de entorno se tomará de la aplicación individual.
iltempo
sí, gracias, funcionó para mí, agregué ENV ['RAILS_ENV'] también
Vijay Sali
26

Runner ejecuta código Ruby en el contexto de Rails de forma no interactiva.

Desde el rails runnercomando:

Usage: runner [options] ('Some.ruby(code)' or a filename)

    -e, --environment=name           Specifies the environment for the runner to operate under (test/development/production).
                                     Default: development

    -h, --help                       Show this help message.

También puede usar runner como una línea de shebang para sus scripts como este:

-------------------------------------------------------------
#!/usr/bin/env /Users/me/rails_project/script/rails runner

Product.all.each { |p| p.price *= 2 ; p.save! }
-------------------------------------------------------------
colsen
fuente
1
¿Por qué solo funciona cuando especifico "/ Users / me / rails_project / script / rails" en su totalidad y no solo "rails"? TIA
iphone007
¿Sus otros comandos de rieles también requieren enumerar la ruta completa? (es decir, servidor de rieles)
colsen
@ iphone007 puede depender de dónde esté ejecutando el script.
David Moles
7

Esta es una pregunta antigua, pero en mi opinión, a menudo encuentro útil crear una tarea de rake ... y en realidad es muy fácil.

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 terminal ejecuta:

rake example:create_user

Localmente, esto se ejecutará en el contexto de su base de datos de desarrollo y, si se ejecuta en Heroku, se ejecutará mientras esté conectado a su base de datos de producción. Encuentro esto especialmente útil para ayudar con migraciones o tablas modificadas.

Mate
fuente