Übergeben Sie die Ruby-Skriptdatei an die Rails-Konsole

117

Gibt es eine Möglichkeit, die Ruby-Datei foo.rb an die Rails-Konsole zu übergeben ? Erwartete Ergebnisse sind, nachdem die Konsole die Rails-Umgebung gestartet hat, um die Datei auszuführen.

Oder eine andere Möglichkeit, mit der ich Dateien in einer Rails-Umgebung ausführen kann, die über die Eingabeaufforderung ausgelöst wird.

Haris Krajina
quelle

Antworten:

166

Eigentlich ist der einfachste Weg, es mit loadinnerhalb der auszuführenrails console

 load './path/to/foo.rb'
Adrian
quelle
5
Das funktioniert super. Aber wenn ich nichts falsch mache, haben Sie keinen Zugriff auf Objekte, die im Skript erstellt wurden. Wie geht das? Der Anwendungsfall besteht darin, einige Objekte einzurichten und sie dann interaktiv zu untersuchen. Ist das möglich?
Dan Barron
1
@ DanBarron können Sie in einen Debugger oder Binding.pry setzen
Grant
Dies ist wie ein Lisp REPL +1
Zeitue
Noob-Hilfe: ./path - ist der Pfad relativ zu Ihrem Rails-Projekt, in dem sich Ihre Datei befindet.
Darpan
87

Sie können verwenden

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

AKTUALISIEREN:

Was wir in letzter Zeit auch häufig verwendet haben, ist das Laden der Rails-Umgebung aus dem Skript selbst heraus. Bedenken Sie doit.rb:

#!/usr/bin/env ruby

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

# ... do your stuff

Dies funktioniert auch, wenn sich das Skript oder das aktuelle Arbeitsverzeichnis nicht im Verzeichnis der Rails-App befinden.

moritz
quelle
Vielen Dank, der einen Job macht! Ich benutze Sublime Text 2, also kann ich jetzt Builds von Rails-Klassen auslösen und die Ausgabe direkt in der IDE sehen :)
Haris Krajina
2
Skript / Runner "eval (File.read 'your_script.rb')" für Rails 2.3 :)
valk
2
Sie können ein ähnliches Muster verwenden, um Dateien in der Konsole f=File.new('path/to/file')auszuführen : zum Ausführen verwenden:f.rewind; eval f.readlines.join("\n");
semiomant
3
Zu Ihrer Information, Sie brauchen das eval(File.read ...)Teil nicht mehr. Rails akzeptiert eine Ruby-Datei als Argument für rails runner:Usage: rails runner [options] [<'Some.ruby(code)'> | <filename.rb>]
Ajedi32
Update - gemäß der Antwort von @ HarisKrajina unten sieht es so aus, als ob rails r path/to/filename.rbes dem bundle exec rails runneroben genannten Befehl funktional entspricht .
Richie Thomas
61

In der Zwischenzeit wurde diese Lösung unterstützt.

rails r PATH_TO_RUBY_FILE

Jetzt viel einfacher.

Haris Krajina
quelle
in welchen Rails-Versionen?
Karatedog
1
Ich denke 3+, ich kann für 5 bestätigen.
Haris Krajina
4
script/console --irb=pry < test.rb > test.log

einfach, schmutzig und blockieren den Prozess am Ende, aber es macht den Job genau so, wie ich es wollte.

Hari Seldon
quelle
4

Erwägen Sie das Erstellen einer Rechenaufgabe.

Für Code, den ich zum Erstellen von Datensätzen oder zum Unterstützen von Migrationen benötige, erstelle ich häufig eine solche Rechenaufgabe aus dieser Antwort . Beispielsweise:

In 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

Und dann im Terminal laufen:

rake example:create_user
Matt
quelle
1

Von diesen zuvor erwähnten Ansätzen schien keiner sauber und ideal zu sein, als würde man erwarten, dass ein eigenständiges Skript ausgeführt wird (nicht über <Umleitung bewertet oder weitergeleitet), aber schließlich funktioniert dies perfekt für mich:

(für Schienen 3)

Fügen Sie oben in Ihr Skript ein:

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

Legen Sie natürlich Ihren eigenen Rails-App-Pfad in der Zeile APP_PATH fest.

Auf diese Weise kann ich vermeiden , jede interaktive Eingabe eines irboder rails cund kann meine testen script.rb von der Eingabeaufforderung Shell, bevor zB. Planen Sie es in Crontab.

Es unterstützt auch problemlos Befehlszeilenparameter und minimiert die Anzahl der Wrapper, bevor Sie zu Ihrem Code gelangen.

CREDIT (zeigt auch ein Rails 2-Beispiel)

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

Marcos
quelle
0

Hier ist der Hack, den ich benutze:

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

Beispiel:

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

Basierend auf der Antwort von @ moritz hier. Ich habe es geändert, da das Arbeitsverzeichnis für File.readdas Rails-Projektstammverzeichnis ist.

Ich weiß, dass dies eine ernsthafte Häresie ist, bei der Python verwendet wird, um einem Ruby-Skript zu helfen. Aber ich konnte keine relpathin Ruby eingebaute Methode finden .

Gutschrift: relpath()wurde von @MestreLion übernommen. Konvertieren Sie den absoluten Pfad in einen relativen Pfad in einem aktuellen Verzeichnis mit Bash

Chaim Leib Halbert
quelle