我在生产资产方面遇到了非常艰难的时期。它归结为我试图覆盖sprokets帮助程序模块,试图看看是什么...当我重新写入以下内容时:
module Sprockets
module Rails
module Helper
def compute_asset_path(path, options = {})
它不会运行。我在我的本地环境中尝试过,它运行得很好。是否存在生产环境不允许我的资产以摘要形式呈现的原因,但我的本地环境会如何?这与绅士的问题有关......
Rails 4.0.3 generating incorrect asset paths with asset_sync
以下是我尝试覆盖该方法后收到的错误(使用RAILS_ENV =开发时没有出错):
ActionView::Template::Error (undefined local variable or method `digest_path' for #<#<Class:0x000001034a99e0>:0x000001034a81d0>):
Gemfile中的资产宝石供参考:
source 'http://rubygems.org'
# ruby '2.1.1'
gem 'rails', '4.0.4'
gem 'jbuilder', '~> 1.2'
gem 'devise'
gem 'devise_invitable'
gem 'figaro'
gem 'mysql2'
gem 'simple_form'
gem 'kaminari'
gem 'statistics'
gem 'possessive'
gem 'geocoder'
gem 'nokogiri'
gem 'asset_sync'
gem 'sprockets-rails', :require => 'sprockets/railtie'
gem 'ledermann-rails-settings', :require => 'rails-settings'
gem 'public_activity'
group :assets do
gem 'therubyracer'
gem 'sass-rails', '~> 4.0.0'
gem 'uglifier', '>= 1.3.0'
gem 'coffee-rails', '~> 4.0.0'
end
group :development do
gem 'better_errors'
gem 'binding_of_caller', :platforms=>[:mri_19, :mri_20, :rbx]
gem 'guard-bundler'
gem 'guard-rails'
gem 'quiet_assets'
gem 'rails_layout'
gem 'rb-fchange', :require=>false
gem 'rb-fsevent', :require=>false
gem 'rb-inotify', :require=>false
end
group :test do
gem 'email_spec', '>= 1.4.0'
gem 'launchy', '>= 2.2.0'
gem 'capybara', '>= 2.0.3'
gem 'database_cleaner', '>= 1.0.0.RC1'
gem 'cucumber-rails', '>= 1.3.1', :require => false
end
group :production do
gem 'rails_12factor'
end
gem 'rspec-rails', '>= 2.12.2', :group => [:development, :test]
gem 'factory_girl_rails', '>= 4.2.0', :group => [:development, :test]
gem 'teaspoon', '>= 0.7.4', :group => [:development, :test]
gem 'cancan', '>= 1.6.9'
gem 'rolify', '>= 3.2.0'
gem 'stripe-rails'
gem 'faker'
gem 'open4'
gem 'unf'
当我在开发模式下运行它时,它运行完全正常。当我通过生产模式运行它时(即使使用相同的配置文件),它也不会继承digest_path
或asset_digest_path
等视图属性为空或manifest
等。
module Sprockets
module Rails
module Helper
def compute_asset_path(path, options = {})
if digest_path = asset_digest_path(path)
path = digest_path if true # BUG: digest assets doesn't work on live, let's just bake it
path += "?body=1" if options[:debug]
File.join(assets_prefix || "/", path)
else
super
end
end
def asset_digest_path(path, options = {})
if manifest = assets_manifest
if digest_path = manifest.assets[path]
return digest_path
end
end
if environment = assets_environment
if asset = environment[path]
return asset.digest_path
end
end
end
end
end
end
module ActionView
module Helpers
module AssetUrlHelper
def compute_asset_path(source, options = {})
dir = ASSET_PUBLIC_DIRECTORIES[options[:type]] || ""
File.join(dir, source)
end
end
end
end
答案 0 :(得分:0)
希望这将有助于拯救我的同事们的朋友们一些头疼:D
我正在将文件上传到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 = '...'
可能会或可能不会被删除。
干杯!