Como executo um arquivo Ruby em um ambiente Rails?

106

Eu quero executar um arquivo Ruby no contexto de um ambiente Rails. O rails runner quase faz o que eu quero fazer, mas gostaria de fornecer apenas o nome do arquivo e os argumentos. Tenho certeza de que isso é possível, pois já fiz isso antes. Alguém pode me lembrar como fazer isso?

Weicool
fonte

Respostas:

36

Simplesmente exija environment.rbem seu script. Se o seu script está localizado no scriptdiretório do seu aplicativo Rails, faça

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

Você pode controlar o ambiente usado (desenvolvimento / teste / produção), definindo a RAILS_ENVvariável de ambiente ao executar o script.

RAILS_ENV=production ruby script/test.rb
iltempo
fonte
Se eu executar o código acima, ele fornecerá "home / apps / config / environment". E se eu tiver 2 rails app rodando no mesmo diretório. Qual ambiente será necessário? Estou enfrentando esse problema na minha caixa local. sugira
Vijay Sali
@VijaySali Presumo que você esteja executando seu script a partir do app/scriptdiretório. O arquivo de ambiente será obtido do aplicativo individual.
iltempo
sim, obrigado, funcionou para mim, adicionei ENV ['RAILS_ENV'] também
Vijay Sali
26

Runner executa código Ruby no contexto do Rails de forma não interativa.

Do 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.

Você também pode usar runner como uma linha shebang para seus scripts como este:

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

Product.all.each { |p| p.price *= 2 ; p.save! }
-------------------------------------------------------------
Colsen
fonte
1
Por que só funciona quando eu especifico "/ Users / me / rails_project / script / rails" por completo e não apenas "rails"? TIA
iphone007
Seus outros comandos do rails também exigem a listagem do caminho completo? (ou seja, servidor rails)
colsen
@ iphone007 pode depender de onde você está executando o script.
David Moles
7

Esta é uma pergunta antiga, mas na minha opinião eu sempre acho útil criar uma tarefa de rake ... e na verdade é muito fácil.

Em 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

E então, no terminal, execute:

rake example:create_user

Localmente, isso será executado no contexto do seu banco de dados de desenvolvimento e, se executado no Heroku, será executado enquanto estiver conectado ao seu banco de dados de produção. Acho isso especialmente útil para ajudar com migrações ou tabelas modificadas.

Matt
fonte