Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何在Heroku多个dynos上使用carrierwave缓存?_Ruby On Rails_Caching_Heroku_Carrierwave - Fatal编程技术网

Ruby on rails 如何在Heroku多个dynos上使用carrierwave缓存?

Ruby on rails 如何在Heroku多个dynos上使用carrierwave缓存?,ruby-on-rails,caching,heroku,carrierwave,Ruby On Rails,Caching,Heroku,Carrierwave,我在Heroku上有一个带有Carrierwave的应用程序。在一个页面上,我有两个表单:一个用于上传图片的ajax表单和一个用于创建对象所需的附加信息的普通表单。假设我的Carrierwave挂载是:picture,每次提交ajax表单时,图片都会临时保存到公用文件夹中,其路径将作为:picture\u cache返回。然后,第二个表单使用它来知道在第二个请求中使用新对象创建哪个图片。这适用于单个dyno 不同的dyno不知道彼此的文件系统。因此,如果提交第二个表单的请求与第一个表单的请求没有

我在Heroku上有一个带有Carrierwave的应用程序。在一个页面上,我有两个表单:一个用于上传图片的ajax表单和一个用于创建对象所需的附加信息的普通表单。假设我的Carrierwave挂载是
:picture
,每次提交ajax表单时,图片都会临时保存到公用文件夹中,其路径将作为
:picture\u cache
返回。然后,第二个表单使用它来知道在第二个请求中使用新对象创建哪个图片。这适用于单个dyno

不同的dyno不知道彼此的文件系统。因此,如果提交第二个表单的请求与第一个表单的请求没有达到相同的dyno,则无法找到图像


有人解决过这个问题吗?

我使用自定义模型,并将所有文件(包括tmp文件)存储在mongodb中。上载被标记为tmp。如果模型被“保存”,我只需删除“tmp”标志。通过这种方式,所有节点始终可以看到所有图像。carrierwave的默认值是缓存在./tmp中,这是非常疯狂的,因为许多多节点配置都会看到这个问题(除非平衡器实现会话关联)

这是我的模型和控制器等:

您必须在表单中执行一些自定义工作:

  • 保存所有发布的文件,无论发生什么
  • 将发布的文件id中继到隐藏字段中
  • 保存时查找文件和/或以前上载的id
  • 创建模型关联
这种方法虽然不“神奇”,但也会产生以下可怕的副作用:

  • 您有一个进程在后台运行作业来缩略图像,而不是每当用户点击“提交”(这是一个严重的DOS向量,尤其是在heroku等内存有限的主机上)时旋转图像

  • 您可以在后台、每小时或任何时间将图像迁移到s3,上传只需有一个新的url(在这种情况下,如果控制器注意到这一点,则需要发出永久重定向)。这真的很好,因为您可以将它们保存在db for dev、staging等中,并在不更改任何上载或查看代码的情况下将部分或全部上载迁移到s3


您解决过这个问题吗?不必使用Mongoid?如果您不使用Mongoid怎么办?@marflar我相信大多数SQL数据库也可以存储图像等二进制数据,例如,如果您对PG和的工作感兴趣。