使用RoR和Heroku上传图片

时间:2015-12-08 10:49:17

标签: ruby-on-rails ruby heroku

我最近在Heroku上的rails应用程序上部署了我的ruby,我正在使用pg gem作为我的数据库。

我创建了一个页面,我可以在其中上传图像并将其显示在主页面上,并将它们保存在应用程序的公共文件夹中。

当我部署它工作正常,但过了一段时间后图像消失了。当我查看我的Heroku日志时,我得到了以下内容:

  ActionController::RoutingError (No route matches [GET]       "/assets/products/6/photos/medium/shanab.jpg"):

我认为图片已保存,但我不知道如何查看它们是否仍在那里。

1 个答案:

答案 0 :(得分:0)

  

但过了一段时间后,图像消失了

Heroku运行ephemeral file system,这意味着每次部署新版本的代码时,旧文件/代码都会被覆盖:

  

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

这意味着即使您的图像正在运行一段时间,每个新部署也将基本覆盖它们。这可能是问题的原因,但我不能确定没有进一步检查。

-

解决这个问题的方法是使用CDN,最常见的(尽管不正确)是将您的应用与S3绑定。

我不知道您正在使用哪个资产处理宝石,但如果它是Paperclip,您将需要使用inbuilt S3 functionality将所有图片资源放到亚马逊的服务器上:< / p>

#app/models/x.rb
class x < ActiveRecord::Base
  has_attached_file :download,
                    :storage => :s3,
                    :s3_credentials => Proc.new{|a| a.instance.s3_credentials }

  def s3_credentials
    {:bucket => "xxx", :access_key_id => "xxx", :secret_access_key => "xxx"}
  end
end