2012-04-25 89 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 
相关问题