将Ruby脚本文件传递到Rails控制台


Answers:


166

实际上,最简单的方法是loadrails console

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

5
这很好。但是除非我做错了事,否则您无权访问在脚本内创建的对象。有什么办法吗?用例是设置一些对象,然后以交互方式浏览它们。那可能吗?
丹·巴伦

1
@DanBarron,您可以放入调试器或binding.pry
授予

这就像Lisp REPL +1
zeitue

Noob帮助:./path-是相对于文件所在的Rails项目的路径。
达尔潘'18

87

您可以使用

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应用程序的目录内,则这也适用。


非常感谢您所做的工作!我正在使用Sublime Text 2,因此现在我将能够触发rails类的构建并直接在IDE中查看输出:)
Haris Krajina 2012年

2
脚本/运行程序“ eval(File.read'your_script.rb')“ for rails 2.3 :)
2012年

2
您可以使用类似的模式在控制台内运行文件:f=File.new('path/to/file')运行使用:f.rewind; eval f.readlines.join("\n");
Semiomant 2013年

3
仅供参考,您不再需要该eval(File.read ...)零件。Rails接受Ruby文件作为以下各项的参数rails runnerUsage: rails runner [options] [<'Some.ruby(code)'> | <filename.rb>]
Ajedi32 '16

更新-根据下面的@HarisKrajina的答案,rails r path/to/filename.rb在功能上等效于上述bundle exec rails runner命令。
Richie Thomas


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

简单,肮脏并最终阻止了该过程,但它的工作与我想要的完全相同。


4

考虑创建一个瑞克任务。

例如,对于我需要创建记录或支持迁移的代码,我经常根据此答案创建一个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

1

在前面提到的这些方法中,没有一个看起来像理想的理想选择,就像您希望运行一个独立的脚本(不能通过<重定向进行评估或传递)一样,但是最后,这对我来说是完美的:

(适用于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从shell提示符,如前。在crontab中安排它。

它也可以平滑地支持命令行参数,并在进入代码之前将包装器的级别降至最低。

CREDIT(还显示了Rails 2示例)

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


0

这是我正在使用的hack:

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红宝石内置的方法。

relpath()致谢:来自@MestreLion,使用Bash在给定当前目录的情况下将绝对路径转换为相对路径

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.