我正在使用Datetimepicker和Slider 。 我将它们包含在我的Gemfile中
gem 'datetimepicker-rails', github: 'zpaulovics/datetimepicker-rails', branch: 'master', submodules: true
source 'https://rails-assets.org' do
# gem 'rails-assets-select2-bootstrap-css'
gem 'rails-assets-seiyria-bootstrap-slider'
end
在我的application.js
//= require moment
//= require bootstrap-datetimepicker
//= require pickers
//= require seiyria-bootstrap-slider
这在开发中效果很好,但是当我在服务器上运行RAILS_ENV=production rake assets:precompile
时(通过Capistrano部署或手动进行RAILS_ENV=production rake assets:precompile
),这些东西似乎并没有被引入。Chrome首先抱怨这两个问题。
我知道我可以把Rails.application.config.assets.precompile += %w( *.js )
,然后执行=javascript_include_tag :XXXX
,但这Rails.application.config.assets.precompile += %w( *.js )
了链轮/清单的目的吗?
我对链轮/清单的理解是,当我在application.js
需要它时,它将包含在部署中,因此客户端对服务器的命中率降低了。
有什么我想念的吗?
编辑跟踪问题到uglifier
gem。 当我删除/注释掉config.assets.js_compressor = :uglifier
并重新编译时,JS再次开始工作。
有什么想法吗?
这是因为与生产相比,事物在开发中的工作方式有所不同。 注意事项:
config.precompile
指令中列出,否则没有任何CSS或JS文件可通过资产管道用于您的应用application.js
,默认情况下,所有CSS和JS文件仅application.css
和application.js
都可用。 public/assets
时, Rails会将每个不是Javascript文件或CSS文件的文件都复制到public/assets
文件夹中。因此,如果要添加一些Web字体,可以制作一个app / assets / fonts /文件夹,然后在其中放置字体,然后在编译资产时将它们复制到public/assets/fonts
文件夹。 请注意,引用这些字体的app/assets/stylesheets/fonts.css.scss
文件不会被复制,除非您将其添加到config.assets.precompile
指令中或从application.css
要求它 config.assets.compile
...如果将其设置为“ true”(在开发中是默认设置),那么Rails将尝试通过首先查看public/assets
目录来查找Javascript或CSS文件,如果可以找不到它,将在您的app/assets
文件夹中搜寻该文件。 如果它在app/assets
找到它,它将继续进行并进行即时编译,然后将其投入使用。 问题是您不会注意到它在开发中发生,然后您提交所有内容并将其推送到生产和BOOM,因为生产将config.assets.compile
设置为“ false”,所以一切都被500错误破坏了。应用程序从“后退”并尝试直接加载文件,而不是使用资产管道。
# Don't fallback to assets pipeline if a precompiled asset is missed
config.assets.compile = false
为什么不在每个环境中都将其设置为“ true”? 好吧,因为它是sloooooow。 而且你不想生产缓慢
RAILS_ENV=production rake assets:clean assets:precompile