2015-05-22 27 views
3

我想在服务器启动时执行两个初始化我的数据库的rake任务。 因此,我放在config/application.rb下面的代码:Rails - 在初始化时执行rake任务

config.after_initialize do 
     Rake::Task[ 'download_csv:get_files' ].invoke 
     Rake::Task[ 'download_csv:place_in_database' ].invoke 
end 

不过,我得到以下错误:

.rvm/rubies/ruby-2.2.1/lib/ruby/2.2.0/rake/task_manager.rb:62:in `[]': Don't know how to build task 'download_csv:get_files' (RuntimeError) 

我在做什么错误? (我的目标是在启动时初始化数据库)。

+0

显示rake文件名.......我确定你把rake文件扩展名改为'.rb' ..把它们改成'.rake' ..它会工作.. –

+0

粘贴输出'rake -T download_csv' –

+0

奥雅纳的文件名是'download_csv.rake','query_api.rake'。帕维尔没有输出。 – octavian

回答

1

download_csv:place_in_database意味着在命名空间download_csv内有一个名为place_in_database的任务。这是你的Rake任务的样子吗?如果您发布代码,将会更容易诊断问题。

此外,请确保您的.rake文件驻留在lib/tasks

5

Rails的任务不会自动加载,你需要先加载它们:

config.after_initialize do 
    Rails.application.load_tasks # <--- 
    Rake::Task['download_csv:get_files'].invoke 
    Rake::Task['download_csv:place_in_database'].invoke 
end 

注意#load_tasks不存储状态,如果再次调用它在其他地方,你可以遇到问题。另一方面,这些任务的名称表明它们不需要在每个Web实例上运行(例如Heroku Dynos);但是,这些任务的名称不需要在每个Web实例上运行(例如Heroku Dynos)。但是他们会使用上述策略在每台机器上运行。因此,如果您已经扩展了web实例(在多台计算机上运行您的应用),那么将这些任务作为自动部署后任务在单个实例(一次性Heroku上的Dyno)上运行将会更加有效。

相关问题