ruby ファイルfoo.rbを Rails コンソールに渡す方法はありますか。期待される結果は、コンソールがレール環境を起動してファイルを実行した後のものです。
または、コマンドプロンプトからトリガーされて、レール環境でファイルを実行できる他の方法。
ruby ファイルfoo.rbを Rails コンソールに渡す方法はありますか。期待される結果は、コンソールがレール環境を起動してファイルを実行した後のものです。
または、コマンドプロンプトからトリガーされて、レール環境でファイルを実行できる他の方法。
実際、最も簡単な方法はload
、rails console
load './path/to/foo.rb'
使用できます
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 アプリのディレクトリ内にない場合にも機能します。
その間、このソリューションはサポートされています。
rails r PATH_TO_RUBY_FILE
はるかに簡単になりました。
script/console --irb=pry < test.rb > test.log
シンプルで、汚れていて、最後にプロセスをブロックしますが、私が望んでいたとおりに仕事をします.
前述のこれらのアプローチのうち、スタンドアロン スクリプトが実行されることを期待するようなクリーンで理想的なものはありませんでした (< リダイレクトを介して評価またはパイプされません)。
(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
がなくなり、シェルプロンプトからscript.rbrails c
をテストできます。crontab でスケジュールします。
コマンドライン パラメーターもスムーズにサポートし、コードに到達する前にラッパーのレベルを最小限に抑えます。
CREDIT (Rails 2 の例も示します)
http://zerowidth.com/2011/03/18/standalone-script-runner-bin-scripts-in-rails.html
私が使用しているハックは次のとおりです。
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
Ruby に組み込まれているメソッドが見つかりませんでした。
クレジット: relpath()
@MestreLion から取得しました。Bashを使用して、現在のディレクトリを指定して絶対パスを相対パスに変換します