【问题标题】:Precompiling additional assets with Rails使用 Rails 预编译其他资产
【发布时间】:2013-01-03 16:23:16
【问题描述】:

我一直在转换一个项目以使用资产管道,但在部署的一部分中遇到了困难。将上限部署到生产服务器后,我收到以下错误。 (在开发模式下一切正常,无需预编译资产)

simile-ajax-api.js isn't precompiled

项目结构类似于

|-app/
  |-assets/
    |-javascripts/
      |- application.js
|-vendor/
  |-assets/
    |-javascripts/
    |-timeline/
      |-timeline_ajax/
        |-simile-ajax-api.js

在我的 application.rb 中,我添加了以下行

config.assets.paths << "vendor/assets/timeline/timeline_ajax"

在我的 production.rb 中,我添加了

  precompile_list = %w(app lib vendor).map do |path|
    Dir[Rails.root.join(*%W(#{path} assets ** *))].select do |f|
      f =~ /(\.js|\.s?css)/
    end
  end.flatten.map do |f|
    f.split(File::SEPARATOR).last
  end.uniq
config.assets.precompile = (config.assets.precompile + precompile_list).uniq
config.assets.precompile << Rails.root.join(*%w( vendor assets timeline timeline_ajax simile-ajax-api.js ))

application.js 看起来像这样:

// It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
// the compiled file.
//
// WARNING: THE FIRST BLANK LINE MARKS THE END OF WHAT'S TO BE PROCESSED, ANY BLANK LINE SHOULD
// GO AFTER THE REQUIRES BELOW.
//
//= require jquery
//= require jquery_ujs
//= require global
//= require_tree ../../../vendor/assets/timeline/timeline_ajax/.
//= require_tree ../../../vendor/assets/timeline/timeline_js/.
//= require timeline-api
//= require jquery.dataTables.min
//= require FixedHeader.min
//= require ColVis.min
//= require jquery.ba-resize.min
//= require jquery-ui
//= require jquery.blockUI
//= require jquery-ui-timepicker-addon
//= require autocomplete-rails
//= require_tree ../../../vendor/assets/javascripts/.
//= require_tree .

最后,它在 application.html.haml 中被加载的位置是

%html
  %head
    - page_title = @page_title ? "#{@page_title}" : ''
    %title= strip_tags page_title

    :javascript
      Timeline_ajax_url= "#{asset_path('simile-ajax-api.js')}";
      Timeline_urlPrefix= '/assets/';
      Timeline_parameters='bundle=true'

知道我哪里出错了吗?如果您需要更多详细信息,请告诉我。

【问题讨论】:

  • 是错字问题吗?路径上缺少javascripts
  • 嗨 Amar - 很抱歉造成混淆,时间线代码故意在 javascripts 目录之外。

标签: ruby-on-rails ruby ruby-on-rails-3.2 asset-pipeline


【解决方案1】:

我认为没有必要像这样声明路径:

//= require_tree ../../../vendor/assets/timeline/timeline_ajax/.

只是:

//= require_tree timeline/timeline_ajax/.

因为所有资产(无论位于何处)都以相同的方式查找。简单地说——如果目录名为assets,管道会查找要包含的文件。

编辑:您的vendor 目录结构似乎有点奇怪:通常您将.js 文件直接复制到assets/javascripts 目录。我认为包括assets/vendor/timeline 会使事情变得复杂。只需将timeline 目录复制到vendor/assets/javascripts

【讨论】:

  • 感谢您的回复,但重构似乎没有修复它。
  • 您可以考虑在production.rb 中恢复管道的默认设置。在我的工作应用程序(rails 3.2.8)中,与pipeline 相关的设置只是:# Don't fallback to assets pipeline if a precompiled asset is missed config.assets.compile = false config.assets.precompile += %w( *.js )。如果您尝试将 simile-ajax-api.js 文件复制到 vendor/assets/javascripts 中,应该没问题。
  • 感谢 Quamara,我已经重新调整了这个项目的结构并清理了 production.rb,它现在似乎可以工作了!
  • 我很高兴听到这个消息。祝你好运。
猜你喜欢
  • 2011-12-20
  • 2012-03-14
  • 1970-01-01
  • 2013-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-02
  • 1970-01-01
相关资源
最近更新 更多