有没有办法将ruby文件foo.rb传递到Rails控制台。预期结果将在控制台启动Rails环境以运行文件之后。
或任何其他允许我在Rails环境中执行文件的方法,都由命令提示符触发。
有没有办法将ruby文件foo.rb传递到Rails控制台。预期结果将在控制台启动Rails环境以运行文件之后。
或任何其他允许我在Rails环境中执行文件的方法,都由命令提示符触发。
Answers:
您可以使用
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
命令。
考虑创建一个瑞克任务。
例如,对于我需要创建记录或支持迁移的代码,我经常根据此答案创建一个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
在前面提到的这些方法中,没有一个看起来像理想的理想选择,就像您希望运行一个独立的脚本(不能通过<重定向进行评估或传递)一样,但是最后,这对我来说是完美的:
(适用于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
与可以检验我的script.rb从shell提示符,如前。在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脚本。但是我找不到relpath
红宝石内置的方法。
relpath()
致谢:来自@MestreLion,使用Bash在给定当前目录的情况下将绝对路径转换为相对路径