在开发模式下我的rails应用程序工作和看起来完全符合我的要求,但在生产中它在chrome和safari上看起来不同,在safari中徽标图像加载但不是字体,在chrome中加载字体而不是图像加上输入字段有点长,并且在chrome中不对齐,但在开发模式下,它们在chrome中看起来都很棒
我一直搞乱了这一点,并删除了公共/资产几次
rake assets:precompile RAILS_ENV=production
没有成功,预编译没有错误
配置/ application.rb中:
# Settings in config/environments/* take precedence over those specified here. # Application configuration should go into files in config/initializers # -- all .rb files in that directory are automatically loaded. config.assets.paths << "#{Rails.root}/assets/fonts" config.assets.paths << "#{Rails.root}/assets/images" config.assets.paths << Rails.root.join("app","assets","fonts") config.assets.precompile += %w( .svg .eot .woff .ttf ) # Set Time.zone default to the specified zone and make Active Record auto-convert to this zone. # Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC. # config.time_zone = 'Central Time (US & Canada)' # The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded. # config.i18n.load_path += Dir[Rails.root.join('my','locales','*.{rb,yml}').to_s] # config.i18n.default_locale = :de config.assets.enabled = true #config.assets.paths << "#{Rails.root}/app/assets/fonts"
配置/环境/制作:
# Code is not reloaded between requests. config.cache_classes = true # Eager load code on boot. This eager loads most of Rails and # your application in memory,allowing both thread web servers # and those relying on copy on write to perform better. # Rake tasks automatically ignore this option for performance. config.eager_load = true # Full error reports are disabled and caching is turned on. config.consider_all_requests_local = false config.action_controller.perform_caching = true # Enable Rack::Cache to put a simple HTTP cache in front of your application # Add `rack-cache` to your Gemfile before enabling this. # For large-scale production use,consider using a caching reverse proxy like Nginx,varnish or squid. # config.action_dispatch.rack_cache = true # Disable Rails's static asset server (Apache or Nginx will already do this). config.serve_static_assets = true #config.assets.compile = true config.assets.precompile = ['*.js','*.css','*.css.erb','*.css.scss'] # Compress JavaScripts and CSS. config.assets.js_compressor = :uglifier # config.assets.css_compressor = :sass config.assets.paths << "#{Rails.root}/assets/fonts" config.assets.paths << "#{Rails.root}/assets/images" config.assets.precompile += %w( .svg .eot .woff .ttf ) config.assets.paths << Rails.root.join('app','assets','fonts') # Do not fallback to assets pipeline if a precompiled asset is missed. config.assets.compile = false config.assets.precompile << /(^[^_\/]|\/[^_])[^\/]*$/ # Generate digests for assets URLs. config.assets.digest = true # Version of your assets,change this if you want to expire all your assets. config.assets.version = '1.0'
解决方法
在config / environments / production.rb文件中,设置:
config.serve_static_assets = false(目前设置为true)
config.assets.compile = true(当前设置为false)
这应该可以解决您的问题.
让我解释一下我要求你做的事情.
>通过设置config.serve_static_assets = false,我们告诉rails服务器,不要添加ActionDispatch :: Static中间件,它用于提供静态资产.
为什么不?
这是因为在生产环境中,您需要在Web服务器(如Apache / Nginx)后面运行您的应用程序服务器(如puma),该服务器旨在直接提供静态文件(包括资产),而无需将请求发送到rails应用服务器.
因为,您没有使用任何Web服务器,我们将其关闭.
>通过设置config.assets.compile = true,我们告诉rails在运行时编译所请求的资产.即,在应用程序/资产,供应商/资产,资产管理/资产中查找所请求的资产,如果从这些位置找到,则提供服务.
默认情况下,config.assets.compile在开发中为true,在生产环境中为false.由于我们没有使用Web服务器来提供静态资产,因此我们要求使用rails来编译我们的资产.
有关详细信息,请参阅asset pipeline documentation.