Rails 4.0.3使用asset_sync生成不正确的资产路径

时间:2014-03-06 18:59:22

标签: ruby-on-rails ruby ruby-on-rails-4 asset-pipeline asset-sync

之前我曾多次使用asset_sync gem取得了巨大的成功,但在Rails 4.0.3项目中使用它似乎导致了问题。

将资产上传,散列并压缩到目标目录(我只使用默认的“资产”),但在登台/生产环境中运行应用程序时,路径不正确。

他们采取以下形式:

S3_DOMAIN.com/stylesheets/application.css

而不是:

S3_DOMAIN.com/assets/application-HASH.css

还有其他人遇到过这个问题吗?我发现反转此行为的唯一方法是将config.assets.compile设置为true,但这在生产环境中不起作用。

以下是相关的配置文件:

  ## environments/staging.rb
  config.serve_static_assets = false
  config.assets.compress = true
  config.assets.js_compressor = :uglifier
  config.assets.css_compressor = :sass
  # Have to set this to true to make asset_sync generate the correct links
  config.assets.compile = false
  config.assets.digest = true
  config.assets.enabled = true
  config.assets.initialize_on_precompile = true
  config.action_controller.asset_host = "//#{Figaro.env.fog_directory}.s3.amazonaws.com"
  config.action_mailer.asset_host = "//#{Figaro.env.fog_directory}.s3.amazonaws.com"
  config.assets.prefix = "/assets"
  config.assets.debug = false
  config.assets.cache_store = :memory_store

##config/asset_sync.yml
defaults: &defaults
  fog_provider: 'AWS'
  aws_access_key_id: "<%= ENV['AWS_ACCESS_KEY_ID'] %>"
  aws_secret_access_key: "<%= ENV['AWS_SECRET_ACCESS_KEY'] %>"
  # To use AWS reduced redundancy storage.
  # aws_reduced_redundancy: true
  # You may need to specify what region your storage bucket is in
  fog_region: <%= ENV['FOG_REGION'] %>
  existing_remote_files: keep
  # To delete existing remote files.
  # existing_remote_files: delete
  # Automatically replace files with their equivalent gzip compressed version
  gzip_compression: true
  # Fail silently.  Useful for environments such as Heroku
  # fail_silently: true

development:
  <<: *defaults
  enabled: false

test:
  <<: *defaults
  enabled: false

staging:
  <<: *defaults
  fog_directory: <%= ENV['FOG_DIRECTORY'] %>

production:
  <<: *defaults
  fog_directory: <%= ENV['FOG_DIRECTORY'] %>

2 个答案:

答案 0 :(得分:0)

您需要在rails 4中以production模式运行相关的所有资产。

例如:

rake assets:precompile RAILS_ENV=production

如果你在默认模式(开发)中运行它,那么hash会有所不同,所以rails会一起离开哈希值。

此外,您需要在启动服务器之前执行此操作,以便找到文件。

注意:我认为此更改允许您在开发中缓存资产。

答案 1 :(得分:0)

希望这将有助于拯救我的程序员朋友们一些头疼:D。我已在“digest_path & asset_digest_path not allowing digest URLs”上回答了这个问题,但会在此处重新发布,以便为您节省一些点击次数。

我正在将文件上传到S3,我没有意识到Rails没有加载清单。您可以正确设置所有生产设置(如上面和其他线程),但如果您没有Rails可读的manifest.json文件,它仍会生成/ javascript / *(示例)网址。

我仍然遇到multi_json gem最新版本的问题,因此我将其降级为1.7.8并且工作正常。

gem 'multi_json', '1.7.8'

这样就可以读取manifest.json创建的rake assets:precompile文件。

关于这个sprockets线程https://github.com/rails/sprockets-rails/issues/107关于你的清单文件是应该在git中还是仅在部署脚本上存在争论,做最适合你的事情,只需确保它在以下内容中找到:

/public/assets/manifest.json 

或用

指定
config.assets.manifest = '...'

可能会或可能不会被删除。

干杯!