【发布时间】:2012-05-05 23:47:11
【问题描述】:
有没有办法将 ruby 文件 foo.rb 传递到 rails 控制台。预期结果将在控制台启动 rails 环境以运行文件之后。
或任何其他允许我在 rails 环境中执行文件的方式,从命令提示符触发。
【问题讨论】:
标签: ruby ruby-on-rails-3
有没有办法将 ruby 文件 foo.rb 传递到 rails 控制台。预期结果将在控制台启动 rails 环境以运行文件之后。
或任何其他允许我在 rails 环境中执行文件的方式,从命令提示符触发。
【问题讨论】:
标签: ruby ruby-on-rails-3
你可以使用
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 应用的目录中,这也有效。
【讨论】:
f=File.new('path/to/file') 运行使用:f.rewind; eval f.readlines.join("\n");
eval(File.read ...) 部分。 Rails 接受一个 Ruby 文件作为 rails runner 的参数:Usage: rails runner [options] [<'Some.ruby(code)'> | <filename.rb>]
rails r path/to/filename.rb 在功能上等同于上面提到的bundle exec rails runner 命令。
script/console --irb=pry < test.rb > test.log
简单,肮脏,并在最后阻止该过程,但它完全按照我想要的方式完成工作。
【讨论】:
其实最简单的方法就是在load里面运行rails console
load './path/to/foo.rb'
【讨论】:
在前面提到的这些方法中,没有一个看起来像您期望运行独立脚本那样干净和理想(不是通过
(对于 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 或 rails c 并且可以在 shell 提示符之前测试我的 script.rb。在 crontab 中安排它。
它也流畅地支持命令行参数,并在获取代码之前最小化包装器的级别。
CREDIT(也显示了 Rails 2 示例)
http://zerowidth.com/2011/03/18/standalone-script-runner-bin-scripts-in-rails.html
【讨论】:
这是我正在使用的 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 脚本。但我找不到 ruby 内置的 relpath 方法。
信用:relpath() 取自@MestreLion,Convert absolute path into relative path given a current directory using Bash
【讨论】:
同时,该方案已得到支持。
rails r PATH_TO_RUBY_FILE
现在简单多了。
【讨论】:
考虑创建一个 rake 任务。
对于我需要创建记录或支持迁移的代码,例如,我经常从this 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
【讨论】: