Ruby on rails 使用RoR和Heroku上传图像

Ruby on rails 使用RoR和Heroku上传图像,ruby-on-rails,ruby,heroku,Ruby On Rails,Ruby,Heroku,我最近在Heroku上部署了我的ruby on rails应用程序,我正在使用pg gem作为我的数据库 我创建了一个页面,我可以上传图片,并将它们显示在主页上,然后保存在应用程序的公共文件夹中 当我部署它时,它工作得很好,但过了一段时间图像就消失了。当我查看Heroku日志时,我得到以下信息: ActionController::RoutingError (No route matches [GET] "/assets/products/6/photos/medium/shan

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

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

当我部署它时,它工作得很好,但过了一段时间图像就消失了。当我查看Heroku日志时,我得到以下信息:

  ActionController::RoutingError (No route matches [GET]       "/assets/products/6/photos/medium/shanab.jpg"):
我想图像已经保存了,但我不知道如何检查它们是否还在

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

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

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

这意味着,即使您的映像工作了一段时间,每次新部署基本上都会覆盖它们。这可能是问题的原因,尽管没有进一步的检查我不能确定

--

解决这一问题的方法是使用一种最常见的(尽管不正确)方法,即将应用程序与
S3
绑定

我不知道您正在使用哪个资产处理gem,但如果是,您将希望使用将所有图像资产放到Amazon的服务器上:

#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
#app/models/x.rb
类x:s3,
:s3_credentials=>Proc.new{| a | a.instance.s3_credentials}
def s3_凭证
{:bucket=>“xxx”,:access\u key\u id=>“xxx”,:secret\u access\u key=>“xxx”}
结束
结束

Heroku只在服务器上临时存储文件,这是因为每个正在运行的dyno都是一个独立的容器(很像docker),它与其他dyno不共享任何内容,并且在重新启动/部署应用程序时会被销毁。因此,当dyno重新启动时,写入磁盘的任何文件都将丢失,并且无法恢复。您需要配置回形针或载波将图像上载到专用文件存储系统,如Amazon S3.plz。请参阅以下链接: