RubyスクリプトファイルをRailsコンソールに渡す


回答:


166

実際、最も簡単な方法はloadrails console

 load './path/to/foo.rb'

5
これはうまくいきます。しかし、私が何か間違ったことをしていない限り、スクリプト内で作成されたオブジェクトにアクセスすることはできません。それを行う方法はありますか?ユースケースは、いくつかのオブジェクトをセットアップしてから、それらをインタラクティブに探索することです。それは可能ですか?
Dan Barron

1
@DanBarronデバッガーまたはbinding.pryに配置できます
付与

これは、Lisp REPL +1のようなものです
zeitue

Noobヘルプ:./path-ファイルが存在するRailsプロジェクトからの相対パスです。
Darpan 2018年

87

使用できます

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

更新:

最近よく使用しているのは、スクリプト自体からRails環境をロードすることです。考慮してくださいdoit.rb

#!/usr/bin/env ruby

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

# ... do your stuff

これは、スクリプトまたは現在の作業ディレクトリがrailsアプリのディレクトリ内にない場合にも機能します。


仕事をしてくれてありがとう!私はSublime Text 2を使用しているので、railsクラスのビルドをトリガーして、IDEで直接出力を表示できるようになります:)
Haris Krajina

2
スクリプト/ランナー "eval(File.read 'your_script.rb')" for rails 2.3 :)
valk

2
あなたは、コンソール内のファイルを実行するために、同様のパターンを使用することができますf=File.new('path/to/file')使用を実行するために:f.rewind; eval f.readlines.join("\n");
semiomant

3
ちなみに、eval(File.read ...)もうその部分は必要ありません。Railsは引数としてRubyのファイルを受け入れるrails runnerUsage: rails runner [options] [<'Some.ruby(code)'> | <filename.rb>]
Ajedi32

更新-以下の@HarisKrajinaの回答に従って、上記rails r path/to/filename.rbbundle exec rails runnerコマンドと機能的に同等であるように見えます。
リッチートーマス

61

それまでの間、このソリューションはサポートされています。

rails r PATH_TO_RUBY_FILE

はるかに簡単になりました。


Railsのどのバージョンで?
空手

1
私は5のために確認することができ、3+考える
ハリスクライナ

4
script/console --irb=pry < test.rb > test.log

シンプルでダーティで、最後にプロセスをブロックしますが、それは私が望んでいたとおりに機能します。


4

レーキタスクの作成を検討してください。

たとえば、レコードを作成したり、移行をサポートしたりする必要があるコードの場合、この回答からそのようなrakeタスクを作成することがよくあります。例えば:

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

そしてターミナル実行で:

rake example:create_user

1

先に述べたこれらのアプローチのうち、スタンドアロンスクリプトが実行されることを期待する(評価されない、または<リダイレクト経由でパイプされる)ように、どれもクリーンで理想的ではないように見えましたが、最終的にこれは私にとって完璧に機能します。

(Rails 3の場合)

スクリプトの上部に挿入します。

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

もちろん、APP_PATH行に独自のRailsアプリのパスを設定します。

そうすれば、インタラクティブな入力を省略したり、シェルプロンプトからscript.rbをテストしirbたりrails cできます。crontabでスケジュールします。

コマンドラインパラメータもスムーズにサポートし、コードに到達する前にラッパーのレベルを最小限に抑えます。

CREDIT(Rails 2の例も示しています)

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


0

これが私が使っているハックです:

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

例:

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

@moritzの回答はこちら。の作業ディレクトリFile.readはRailsプロジェクトのルートであるため、変更しました。

Rubyのスクリプトを助けるためにpythonを使用することは、これが深刻な異端であることを知っています。しかし、私はrelpathルビーに組み込まれたメソッドを見つけることができませんでした。

クレジット:relpath()@MestreLionから取得、Bashを使用して現在のディレクトリを指定して絶対パスを相対パスに変換

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.