Passer le fichier de script ruby ​​à la console rails

117

Existe-t-il un moyen de transmettre le fichier ruby, foo.rb à la console rails. Les résultats attendus seraient après le démarrage de la console sur l'environnement pour exécuter le fichier.

Ou tout autre moyen qui me permettrait d'exécuter un fichier dans un environnement rails, déclenché à partir de l'invite de commande.

Haris Krajina
la source

Réponses:

166

En fait, le moyen le plus simple est de l'exécuter avec loadà l'intérieur durails console

 load './path/to/foo.rb'
Adrian
la source
5
Cela fonctionne très bien. Mais à moins que je ne fasse quelque chose de mal, vous n'avez pas accès aux objets créés à l'intérieur du script. Un moyen de faire ça? Le cas d'utilisation est de configurer certains objets, puis de les explorer de manière interactive. Est-ce possible?
Dan Barron
1
@DanBarron vous pouvez mettre un débogueur ou binding.pry
accordez le
C'est comme un Lisp REPL +1
zeitue
Noob help: ./path - est le chemin relatif à votre projet de rails où réside votre fichier.
Darpan
87

Vous pouvez utiliser

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

METTRE À JOUR:

Ce que nous avons également beaucoup utilisé ces derniers temps, c'est de charger l'environnement rails à partir du script lui-même. Considérez doit.rb:

#!/usr/bin/env ruby

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

# ... do your stuff

Cela fonctionne également si le script ou le répertoire de travail actuel ne se trouve pas dans le répertoire de l'application rails.

Moritz
la source
Merci beaucoup qui fait un travail! J'utilise Sublime Text 2 donc maintenant je pourrai déclencher des builds de classes de rails et voir la sortie directement dans IDE :)
Haris Krajina
2
script / runner "eval (File.read 'your_script.rb')" pour les rails 2.3 :)
valk
2
vous pouvez utiliser un modèle similaire pour exécuter des fichiers à l'intérieur de la console: f=File.new('path/to/file')pour exécuter utilisez:f.rewind; eval f.readlines.join("\n");
semiomant
3
Pour info, vous n'avez plus besoin de la eval(File.read ...)pièce. Rails accepte un fichier Ruby comme argument pour rails runner:Usage: rails runner [options] [<'Some.ruby(code)'> | <filename.rb>]
Ajedi32
Mise à jour - selon la réponse de @ HarisKrajina ci-dessous, semble être rails r path/to/filename.rbfonctionnellement équivalent à la bundle exec rails runnercommande mentionnée ci-dessus.
Richie Thomas
61

En attendant, cette solution a été prise en charge.

rails r PATH_TO_RUBY_FILE

Beaucoup plus simple maintenant.

Haris Krajina
la source
dans quelles versions de Rails?
karatedog
1
Je pense que 3+, je peux confirmer pour 5.
Haris Krajina
4
script/console --irb=pry < test.rb > test.log

simple, sale et bloque le processus à la fin, mais il fait exactement le travail que je voulais.

hari seldon
la source
4

Envisagez de créer une tâche de râteau.

Pour le code dont j'ai besoin pour créer des enregistrements ou prendre en charge les migrations, par exemple, je crée souvent une tâche de rake comme celle-ci à partir de cette réponse . Par exemple:

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
end

Et puis dans le terminal, exécutez:

rake example:create_user
Mat
la source
1

Parmi ces approches mentionnées précédemment, aucune ne semblait propre et idéale, comme vous vous attendriez à ce qu'un script autonome s'exécute (ne soit pas évalué ou envoyé via <redirection), mais finalement cela fonctionne parfaitement pour moi:

(pour Rails 3)

Insérez en haut de votre script:

#!/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...

Bien sûr, définissez votre propre chemin d'accès à l'application Rails dans la ligne APP_PATH.

De cette façon, je peux éviter d'avoir à entrer n'importe quel interactif irbou rails cet peut tester mon script.rb à partir de l'invite du shell, avant par exemple. le programmer dans crontab.

Il prend également en charge les paramètres de ligne de commande et minimise les niveaux de wrappers avant d'accéder à votre code.

CREDIT (montre également un exemple de Rails 2)

http://zerowidth.com/2011/03/18/standalone-script-runner-bin-scripts-in-rails.html

Marcos
la source
0

Voici le hack que j'utilise:

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}')";}

Exemple:

cd ~/rails_project/app/helpers
rr my_script.rb

Basé sur la réponse de @ moritz ici. Je l'ai changé, car le répertoire de travail pour File.readest la racine du projet Rails.

Je sais que c'est une hérésie sérieuse, utilisant python pour aider un script ruby. Mais je n'ai pas trouvé de relpathméthode intégrée au rubis.

Crédit: a relpath()été tiré de @MestreLion, Convertir le chemin absolu en chemin relatif donné un répertoire courant en utilisant Bash

Chaim Leib Halbert
la source