Wie führe ich eine Ruby-Datei in einer Rails-Umgebung aus?

106

Ich möchte eine Ruby-Datei im Kontext einer Rails-Umgebung ausführen. Rails Runner macht fast das, was ich machen möchte, aber ich möchte ihm nur den Dateinamen und die Argumente geben. Ich bin mir ziemlich sicher, dass dies möglich ist, da ich es schon einmal gemacht habe. Kann mich jemand daran erinnern, wie das geht?

weicool
quelle

Antworten:

36

Einfach environment.rbin Ihrem Skript benötigen . Wenn sich Ihr Skript im scriptVerzeichnis Ihrer Rails-App befindet, tun Sie dies

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

Sie können die verwendete Umgebung (Entwicklung / Test / Produktion) steuern, indem Sie RAILS_ENVbeim Ausführen des Skripts die Umgebungsvariable festlegen.

RAILS_ENV=production ruby script/test.rb
iltempo
quelle
Wenn ich den obigen Code ausführe, wird "home / apps / config / environment" angezeigt. Was ist, wenn ich 2 Rails App im selben Verzeichnis laufen habe. Welche Umgebung wird es brauchen? Ich bin mit diesem Problem in meiner lokalen Box konfrontiert. Bitte vorschlagen
Vijay Sali
@ VijaySali Ich gehe davon aus, dass Sie Ihr Skript aus dem app/scriptVerzeichnis ausführen . Die Umgebungsdatei wird aus der einzelnen App entnommen.
Iltempo
yup danke, es hat bei mir funktioniert, ich habe auch ENV ['RAILS_ENV'] hinzugefügt
Vijay Sali
26

Runner führt Ruby-Code im Kontext von Rails nicht interaktiv aus.

Vom rails runnerBefehl:

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.

Sie können Runner auch als Shebang-Zeile für Ihre Skripte verwenden:

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

Product.all.each { |p| p.price *= 2 ; p.save! }
-------------------------------------------------------------
Colsen
quelle
1
Warum funktioniert es nur, wenn ich "/ Users / me / rails_project / script / Rails" vollständig und nicht nur "Rails" angebe? TIA
iphone007
Müssen Ihre anderen Rails-Befehle auch den vollständigen Pfad auflisten? (dh Rails Server)
Colsen
@ iphone007 hängt möglicherweise davon ab, von wo aus Sie das Skript ausführen.
David Moles
7

Dies ist eine alte Frage, aber meiner Meinung nach finde ich es oft hilfreich, eine Rechenaufgabe zu erstellen ... und es ist eigentlich sehr einfach.

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

Und dann im Terminal laufen:

rake example:create_user

Lokal wird dies im Kontext Ihrer Entwicklungsdatenbank ausgeführt. Wenn es auf Heroku ausgeführt wird, wird es ausgeführt, während eine Verbindung zu Ihrer Produktionsdatenbank besteht. Ich finde dies besonders nützlich, um bei Migrationen oder geänderten Tabellen zu helfen.

Matt
quelle