我有一个使用Amazon S3托管资产的Rails 3.2应用程序。我正在使用capistrano将其部署到Digital Ocean。以下是配方的资产部分:
task :precompile_assets, roles: :wrk do
run "cd #{release_path}; RAILS_ENV=production bundle exec rake assets:precompile"
end
task :sync_assets, roles: :wrk do
run "cd #{release_path}; RAILS_ENV=production bundle exec rake sync:assets"
end
同步任务:
namespace :sync do
desc "sync methods"
task assets: :environment do
################
# sync with s3 #
################
puts "Synchronizing public/assets/* with s3://#{AWS_CONFIG['bucket']}/assets/"
system("s3cmd sync -P public/assets/* s3://#{AWS_CONFIG['bucket']}/assets/")
end
end
这是我的produ.rb:
config.serve_static_assets = false
config.assets.compress = true
config.assets.compile = false
config.assets.digest = true
config.assets.enabled = true
config.assets.initialize_on_precompile = true
config.action_controller.asset_host = "//#{AWS_CONFIG['bucket']}.s3.amazonaws.com"
config.assets.version = '1.0'
部署完美无瑕,资产预编译并发送到S3,我可以在我的桶中看到它们,我可以在Chrome中浏览它们。但是我访问的任何页面都会得到ActionView::Template::Error (anyfile isn't precompiled)
。
任何文件......图像,CSS,JS等都会发生这种情况。
刚刚发现Rails.configuration.assets.digests在生产中返回nil。也许问题存在,由于某种原因,链轮没有找到manifest.yml。
我可能错了,但看起来sprockets在查找manifest.yml时没有在config中使用assets_host。
https://github.com/rails/rails/blob/3-2-stable/actionpack/lib/sprockets/railtie.rb#L38
我只复制了来自S3的manifest.yml并将其放在public / assets中,错误消失了。