web-dev-qa-db-ja.com

Ruby script file to Rails console

Rubyファイル、foo.rbをRailsコンソールに渡す方法はありますか。期待される結果は、コンソールがファイルを実行するRails環境を開始した後です。

または、コマンドプロンプトからトリガーされるRails環境でファイルを実行できる他の方法。

100
Haris Krajina

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

Rails r PATH_TO_Ruby_FILE

より簡単になりました。

38
Haris Krajina

実際、最も簡単な方法は、Rails console内でloadを指定して実行することです

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

使用できます

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アプリのディレクトリ内にない場合にも機能します。

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

シンプルで汚い、最後にプロセスをブロックしますが、それは私が望んでいたように仕事をします。

4
hari seldon

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

たとえば、レコードを作成したり、移行をサポートしたりする必要があるコードの場合、よく this answer からそのような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

そして、ターミナルで次を実行します:

rake example:create_user
4
Matt

前述のこれらのアプローチのうち、スタンドアロンスクリプトの実行を期待するようなきれいで理想的なものはありませんでした(評価やパイプでリダイレクトされません)が、最終的にこれは私に最適です:

(for 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アプリパスを設定します。

そうすれば、インタラクティブなirbまたはRails cそして、たとえば、シェルプロンプトからmyscript.rbをテストできます。 crontabでスケジュールします。

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

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

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

1
Marcos

私が使用しているハックは次のとおりです。

_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プロジェクトルートであるため、変更しました。

pythonを使用してRubyスクリプトを支援します。しかし、組み込みのrelpathメソッドが見つかりませんでした。ルビー。

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

0