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

是否有方法将 Ruby 文件 Foo.rb传递到 Rails 控制台。预期的结果将是在控制台启动 Rails 环境以运行文件之后。

或任何其他方式,将允许我执行文件在轨道环境,从命令提示符触发。

75448 次浏览

你可以用

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

更新:

我们最近还经常使用的是从脚本本身内部加载 Rail 环境。考虑 doit.rb:

#!/usr/bin/env ruby


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


# ... do your stuff

如果脚本或当前工作目录不在 Railsapp 的目录中,也可以这样做。

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

简单,肮脏,并在最后阻塞进程,但它完全按照我想要的工作。

实际上,最简单的方法是在 rails console中使用 load运行它

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

在前面提到的这些方法中,没有一种看起来像您期望运行的独立脚本那样干净和理想(不会通过 < 重定向获得 eval 或 pipe) ,但是最终这种方法对我来说非常完美:

(铁路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,并且可以在在 crontab 中调度之前从 shell 提示符测试我的 Script.rb

它还平稳地支持命令行参数,并在开始编写代码之前最小化包装器的级别。

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 的回答,我做了改动,因为工作目录是 Rails 项目的 root。

我知道这是一些严重的异端邪说,使用 python 来帮助红宝石脚本。但是我找不到嵌入 Ruby 的 relpath方法。

图片来源: relpath()取自@MestreLion,使用 Bash 将绝对路径转换为给定工作目录的相对路径

与此同时,这个解决方案得到了支持。

rails r PATH_TO_RUBY_FILE

现在简单多了。

考虑创建一个 rake 任务。

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