132

有没有办法将 ruby​​ 文件foo.rb 传递给 rails 控制台。预期结果将在控制台启动 rails 环境以运行文件之后。

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

4

7 回答 7

184

load实际上,最简单的方法是在内部运行它rails console

 load './path/to/foo.rb'
于 2013-11-02T23:52:24.340 回答
91

您可以使用

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 应用程序的目录中,这也有效。

于 2012-04-25T14:23:51.463 回答
79

同时,该解决方案已得到支持。

rails r PATH_TO_RUBY_FILE

现在简单多了。

于 2016-06-16T12:10:40.330 回答
5
script/console --irb=pry < test.rb > test.log

简单,肮脏,并在最后阻止该过程,但它完全按照我想要的方式完成了工作。

于 2013-02-03T15:29:33.490 回答
5

考虑创建一个 rake 任务。

例如,对于我需要创建记录或支持迁移的代码,我经常从这个 answer创建一个像这样的 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
于 2017-02-28T01:41:31.707 回答
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 应用程序路径。

这样,我可以避免输入任何交互式irb或并且可以在 shell 提示符之前rails c测试我的script.rb ,例如。在 crontab 中安排它。

它也流畅地支持命令行参数,并在获取代码之前最小化包装器的级别。

信用(也显示了 Rails 2 示例)

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

于 2014-10-27T15:56:52.053 回答
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

基于@moritz 在此处的回答。我更改了它,因为它的工作目录File.read是 Rails 项目根目录。

我知道这是一些严重的异端邪说,使用 python 来帮助一个 ruby​​ 脚本。但我找不到relpathruby​​ 内置的方法。

信用:relpath()取自@MestreLion,使用 Bash 将绝对路径转换为给定当前目录的相对路径

于 2015-06-29T22:14:08.607 回答