Comment exécuter un fichier Ruby dans un environnement Rails?

106

Je souhaite exécuter un fichier Ruby dans le contexte d'un environnement Rails. rails runner fait presque ce que je veux faire, mais je voudrais juste lui donner le nom du fichier et les arguments. Je suis presque sûr que cela est possible puisque je l'ai déjà fait. Quelqu'un peut-il me rappeler comment faire cela?

weicool
la source

Réponses:

36

Exigez simplement environment.rbdans votre script. Si votre script se trouve dans le scriptrépertoire de votre application Rails, faites

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

Vous pouvez contrôler l'environnement utilisé (développement / test / production) en définissant la RAILS_ENVvariable d'environnement lors de l'exécution du script.

RAILS_ENV=production ruby script/test.rb
iltempo
la source
Si j'exécute le code ci-dessus, il donnera "home / apps / config / environment". Que faire si l'application 2 rails s'exécute sur le même répertoire. Quel environnement faudra-t-il? je suis confronté à ce problème dans ma boîte locale. veuillez suggérer
Vijay Sali
@VijaySali Je suppose que vous exécutez votre script à partir du app/scriptrépertoire. Le fichier d'environnement sera extrait de l'application individuelle.
iltempo
yup merci ça a fonctionné pour moi, j'ai ajouté ENV ['RAILS_ENV'] aussi
Vijay Sali
26

Runner exécute le code Ruby dans le contexte de Rails de manière non interactive.

De la rails runnercommande:

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.

Vous pouvez également utiliser runner comme ligne Shebang pour vos scripts comme ceci:

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

Product.all.each { |p| p.price *= 2 ; p.save! }
-------------------------------------------------------------
Colsen
la source
1
Pourquoi cela ne fonctionne-t-il que lorsque je spécifie "/ Users / me / rails_project / script / rails" en entier et pas seulement "rails"? TIA
iphone007
Vos autres commandes de rails nécessitent-elles également de répertorier le chemin complet? (ie serveur rails)
colsen
@ iphone007 peut dépendre de l'endroit où vous exécutez le script.
David Moles
7

C'est une vieille question, mais à mon avis, je trouve souvent utile de créer une tâche de râteau ... et c'est en fait très facile.

Dans 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

Et puis dans le terminal, exécutez:

rake example:create_user

Localement, cela sera exécuté dans le contexte de votre base de données de développement, et s'il est exécuté sur Heroku, il sera exécuté tout en étant connecté à votre base de données de production. Je trouve cela particulièrement utile pour aider avec les migrations ou les tables modifiées.

Mat
la source