如何从heroku上的rake任务访问文件?

时间:2012-09-05 21:43:05

标签: database ruby-on-rails-3 heroku

我正在尝试在Rails应用中播放数据,尤其是使用carrierwave的应用。我正在使用stackoverflow上的2个不错的解决方案的组合!

rake task + yml files for seeding

seeding carrierwave

我有以下内容:

namespace :db do
  desc "This loads the development data."
  task :seed => :environment do
    require 'active_record/fixtures'
    Dir.glob(RAILS_ROOT + '/db/fixtures/*.yml').each do |file|
      base_name = File.basename(file, '.*')
      puts "Loading #{base_name}..."
      ActiveRecord::Fixtures.create_fixtures('db/fixtures', base_name)
    end
    #add in the image file for the default data
    for item in Item.find(:all)
      item.filename.store!(File.open(File.join(Rails.root, "app/assets/images/objects/" + item.name.gsub(/ /,'').downcase + ".svg")))
      item.save!
    end
  end

  desc "This drops the db, builds the db, and seeds the data."
  task :reseed => [:environment, 'db:reset', 'db:seed']
end

但是在heroku上,我不断收到有关路径的错误,例如

rake aborted!
No such file or directory - app/assets/images/objects/house.svg

我尝试了几行版本:

item.filename.store!(File.open(File.join(Rails.root, "app/assets/images/objects/" + item.name.gsub(/ /,'').downcase + ".svg")))

我基本上改变了使用File.join和连接,并尝试使用RAILS_ROOT,这似乎在上面工作正常,但我似乎总是得到这个错误。

1 个答案:

答案 0 :(得分:3)

您是在app/assets/images/objects/创建任何文件还是以其他方式放置数据?该目录是否存在于您的git仓库中?您可以通过从命令行运行heroku run ls app/assets/images/objects/来检查heroku上是否存在该目录。

在heroku上运行的所有应用都使用ephemeral filesystem

  

每个dyno都有自己的短暂文件系统,并带有最近部署代码的全新副本。在dyno的生命周期中,它的运行进程可以使用文件系统作为临时暂存器,但是没有任何其他dyno中的进程可以看到写入的文件任何写入的文件都将被丢弃。 dyno已停止或重新启动

这意味着除非您的git存储库中有一个名为app/assets/images/objects/的目录中的文件,或者在部署程序后以编程方式创建这些文件,否则实际上可能没有任何此类文件或目录用这个名字。