2012-04-25 3 views
80

Rubyファイルをfoo.rbをレールコンソールに渡す方法はありますか?コンソールがファイルを実行するための環境を起動した後に期待される結果が得られます。ルビースクリプトファイルをレールコンソールに渡す

または、コマンドプロンプトから起動されたrails環境でファイルを実行できる方法。

+0

可能な重複: //stackoverflow.com/questions/9757261/how-do-i-run-a-ruby-file-in-a-rails-environment) –

答えて

17

、@MestreLionから撮影された、このソリューションがサポートされています。

rails r PATH_TO_RUBY_FILE 

非常に簡単です。

72

あなたは

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

UPDATEを使用することができます。

我々はまた、最近多くを使用して、スクリプト自体の中からレールの環境をロードすることですされている何

#!/usr/bin/env ruby 

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

# ... do your stuff 
+0

ありがとう、仕事をしてくれてありがとう!私は崇高なテキスト2を使用していますので、今度はレールクラスのビルドをトリガし、IDEで直接出力を見ることができます:) –

+2

スクリプト/ランナー「eval(File.read 'your_script.rb')」レール2.3 :) – valk

+2

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

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

、シンプル汚い、最後にプロセスをブロックし、それは私が欲しかったまったく同じ仕事をしていません:doit.rbを考えてみましょう。

123

実際には、最も簡単な方法は、先に述べたこれらのアプローチのrails console

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

これは素晴らしい動作します。しかし、何か間違っていない限り、スクリプト内で作成されたオブジェクトにアクセスすることはできません。それを行うには?ユースケースは、いくつかのオブジェクトを設定し、対話的にそれらを探索することです。それは可能ですか? –

+0

これは簡単です。ありがとう。 – Abram

+0

@DanBarronデバッガやbinding.pryに置くことができます – grant

1

loadでそれを実行することで、どれもEVAL-取得していない(スタンドアロンスクリプトを実行するために期待されるようにきれいで、理想的な見えましたEDまたは<リダイレクト経由パイプ)が、最終的には、これは私にとっては完璧に動作します:あなたのスクリプトの先頭に

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

そのように、私は、任意のインタラクティブirbrails cを入力する手間を省くことができ、例えば前に、シェルプロンプトから私のscript.rbをテストすることができます。それをcrontabでスケジューリングする。

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

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 

@モリッツの

CREDITは

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

0

ここで私が使用しているハックだ(また、Railsの2例を示します)ここで答えてください。 File.readの作業ディレクトリがRailsプロジェクトのルートなので、私はそれを変更しました。

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

クレジット:relpath()が一方Convert absolute path into relative path given a current directory using Bash

1

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

レコードを作成したり、マイグレーションをサポートするコードの場合は、たとえば、this answerのようなレーキタスクを作成することがよくあります。

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 

そして、端末の実行中:

lib/tasks/example.rakeで:たとえば

rake example:create_user 
[私はRailsの環境でRubyのファイルを実行するにはどうすればよい?](HTTPの
関連する問題