2012-04-25 86 views
80

有沒有辦法將ruby文件foo.rb傳遞給rails控制檯。預期的結果是在控制檯啓動rails環境後運行文件。將ruby腳本文件傳遞給rails控制檯

或任何其他方式,這將允許我在rails環境中執行文件,從命令提示符觸發。

+0

[如何運行在Rails環境Ruby的文件?(HTTP的可能重複: //sackoverflow.com/ com/9757261/how-do-i-run-a-ruby-file-in-a-rails-environment) – 2016-09-07 17:27:45

回答

17

同時,該解決方案提供了支持。

rails r PATH_TO_RUBY_FILE 

現在更簡單了。

72

您可以使用

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

UPDATE:

我們也一直在使用什麼很多最近是從腳本本身內加載Rails環境。考慮doit.rb

#!/usr/bin/env ruby 

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

# ... do your stuff 
+0

非常感謝你的工作!我正在使用Sublime Text 2,所以現在我將能夠觸發rails類的構建並直接在IDE中查看輸出:) – 2012-04-25 15:04:22

+2

腳本/ runner「eval(File.read'your_script.rb')」for rails 2.3 :) – valk 2012-11-20 10:30:58

+2

你可以使用類似的模式在控制檯中運行文件:'f = File.new('path/to/file')'用於運行use:'f.rewind; eval f.readlines.join(「\ n」);' – semiomant 2013-06-28 14:08:06

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

簡單的,骯髒的,並在結束阻塞進程,但它確實酷似我想要的工作。

123

其實,最簡單的方法是用load運行它rails console

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

這很好。但是除非我做錯了什麼,否則你無法訪問在腳本中創建的對象。任何方式來做到這一點?用例是設置一些對象,然後交互式地探索它們。那可能嗎? – 2014-01-21 15:33:39

+0

太容易了。謝謝。 – Abram 2015-09-02 20:05:58

+0

@DanBarron你可以放在一個調試器或binding.pry – grant 2016-04-19 20:35:05

1

前面提到的這些方法裏面,似乎沒有乾淨,喜歡的理想,你會期望一個獨立的腳本來運行(不得到EVAL-編輯或通過<重定向管道),但最後這個完美的作品對我來說:

(爲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,並且可以從shell提示下測試我script.rb,如前。在crontab中調度它。

它也可以順暢地支持命令行參數,並在獲取代碼之前最小化包裝器的級別。

CREDIT(還示出了軌道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 

基於@莫里茨的在這裏回答。我改變了它,因爲File.read的工作目錄是Rails項目的根目錄。

我知道這是一些嚴重的異端,使用python來幫助一個ruby腳本。但是我找不到在Ruby中內置的relpath方法。

信用:relpath()從@MestreLion採取Convert absolute path into relative path given a current directory using Bash

1

考慮創建一個rake任務。

對於我需要創建記錄或支持遷移的代碼,例如,我經常創建一個類似this answer的耙子任務。例如:

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 
相關問題