回答:
実際、最も簡単な方法は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アプリのディレクトリ内にない場合にも機能します。
f=File.new('path/to/file')
使用を実行するために:f.rewind; eval f.readlines.join("\n");
eval(File.read ...)
もうその部分は必要ありません。Railsは引数としてRubyのファイルを受け入れるrails runner
:Usage: rails runner [options] [<'Some.ruby(code)'> | <filename.rb>]
rails r path/to/filename.rb
のbundle exec rails runner
コマンドと機能的に同等であるように見えます。
レーキタスクの作成を検討してください。
たとえば、レコードを作成したり、移行をサポートしたりする必要があるコードの場合、この回答からそのような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
先に述べたこれらのアプローチのうち、スタンドアロンスクリプトが実行されることを期待する(評価されない、または<リダイレクト経由でパイプされる)ように、どれもクリーンで理想的ではないように見えましたが、最終的にこれは私にとって完璧に機能します。
(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
これが私が使っているハックです:
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を使用して現在のディレクトリを指定して絶対パスを相対パスに変換