Ruby on rails 为什么可以';我是否将站点地图写入具有只读文件系统的Heroku堆栈上的临时目录?

Ruby on rails 为什么可以';我是否将站点地图写入具有只读文件系统的Heroku堆栈上的临时目录?,ruby-on-rails,heroku,rake,sitemap,Ruby On Rails,Heroku,Rake,Sitemap,我正在为我的网站生成一个站点地图,并将其临时保存到tmp文件夹,然后上传到我的Amazon AWS帐户。我正在使用站点地图生成器和fog gems来帮助我。到目前为止我有这个 # In sitemap.rb # Set the host name for URL creation SitemapGenerator::Sitemap.default_host = "http://mycoolapp.com/" # pick a place safe to write the files #Si

我正在为我的网站生成一个站点地图,并将其临时保存到tmp文件夹,然后上传到我的Amazon AWS帐户。我正在使用站点地图生成器和fog gems来帮助我。到目前为止我有这个

# In sitemap.rb

# Set the host name for URL creation
SitemapGenerator::Sitemap.default_host = "http://mycoolapp.com/"

# pick a place safe to write the files
#SitemapGenerator::Sitemap.public_path = 'tmp/'

# store on S3 using Fog
SitemapGenerator::Sitemap.adapter = SitemapGenerator::S3Adapter.new

# inform the map cross-linking where to find the other maps
SitemapGenerator::Sitemap.sitemaps_host = "http://#{ENV['FOG_DIRECTORY']}.s3.amazonaws.com/"

# pick a namespace within your bucket to organize your maps
SitemapGenerator::Sitemap.sitemaps_path = '/'

SitemapGenerator::Sitemap.create do
  # Put links creation logic here.
  #

  add '/home'

  add '/about'

  add '/contact'
end
每当我运行heroku run rake sitemap:create时,我都会收到以下错误

In '/app/tmp/':
511
rake aborted!
Read-only file system - /sitemap.xml.gz

我真不明白为什么它不起作用。我甚至确保tmp文件夹是通过运行
Rails.root.join('tmp')
作为初始值来创建的。如果您能帮我解决这个问题,我将不胜感激。

因此,我在Heroku和
站点地图生成器
上尝试遵循
fog
说明时遇到了同样的问题。我最终切换到了
carrierwave
,发现它是即插即用的

请查看文档,如果您有问题,请告诉我,因为我几个月前刚刚做了这件事,您可能遇到了任何障碍。

不要向文件系统的根目录写信 Rake非常清楚错误的来源:

雷克流产了
只读文件系统-/sitemap.xml.gz

这表示您的rake任务正在尝试将文件写入文件系统的根目录

如果您没有将a堆栈与like一起使用,则需要确保您正在写入
{RAILS\u ROOT}/tmp
,而不是文件系统的根。我自己还没有测试过,但您可以通过将
sitemaps\u path
指向。例如:

SitemapGenerator::Sitemap.sitemaps_path = '/app/tmp'

如果这不起作用,您将不得不跟踪gem或rake任务将根目录定义为写入
sitemap.xml.gz
文件的位置。

不幸的是,heroku不允许您直接修改文件系统-您必须在内存中构建站点地图并将其流式传输到aws,而无需使用临时文件。嗯,有任何链接可以帮助我继续吗?我以前读过这篇文章,它对我没有多大帮助。如果它告诉我我的代码应该工作,因为我正在将其写入tmp,
有两个可写目录:./tmp和。/log
。我弄糊涂了什么?嗯,我以为sitemaps_path是用于AWS路径位置的?@jason328它实际上是“bucket namespace”。如果更改该值没有帮助,您也可以尝试设置中使用的
SitemapGenerator::Sitemap.public_path='tmp/'
。您当前已将该行注释掉。如果可行,我会更新答案;如果没有,你将不得不遵循我的建议,追踪写入路径的定义位置。是的,它对我不起作用。我想我必须找到写路径。虽然除了寻找写路径(不确定从哪里开始)之外,我仍然不知道如何解决这个问题,但我相信你的答案。我最终尝试了carrierwave,但它最终没有起作用。我收到了与问题中发布的相同的错误。听起来你的应用程序没有配置为将sitemap_生成器发送到S3。我不确定如何解决该问题。我按照指示进行操作。如果你想跳上SO聊天,请告诉我,我们可以进行故障排除。让我们