生产部署中遇到一个问题,希望高手帮忙看看?
我在某个单独页面内引入了一个第三方的 js,我没有把它 include 到 application.js 中,因为我觉得只有这一个页面用,不能放到 application.js 中。
于是乎,我就在这个单独页面中加入了这行:
<%= javascript_include_tag "jquery.fancybox-1.3.4" %>
开发环境一切 ok,到了生产部署的时候,就报错啦:
ActionView::Template::Error (jquery.fancybox-1.3.4 isn't precompiled):
1: <%= javascript_include_tag "jquery.fancybox-1.3.4" %>
当然先问 google 大神+stackoverflow 大神,巴拉巴拉,得到了一堆的指导,屁如:
config.assets.precompile += %w( jquery.fancybox-1.3.4.js )
2.去人肉到生产环境下检查 cap deploy 是否生成了编译后的 js,果然,也找到了
# ll public/assets/jquery.fancybox-1.3.4*
public/assets/jquery.fancybox-1.3.4-9d272ff223e751fc8890a84ebfc51814.js
public/assets/jquery.fancybox-1.3.4-9d272ff223e751fc8890a84ebfc51814.js.gz
public/assets/jquery.fancybox-1.3.4.js
public/assets/jquery.fancybox-1.3.4.js.gz
# pwd
/data/www/current
一切看上去挺好的啊,可是,前台一刷,就是还报“jquery.fancybox-1.3.4 isn't precompiled”,为何啊?!
别跟我说,放到直接放到 public 里,也别跟我说设置 config.assets.compile = true,这些都是 workaround,我想知道我到底卡在了哪里。 另外,查了“isn't precompile”提示只出现在 rails_helper.rb 的 digest_for 方法中,看了看,大致是说我没有设置 compile_assets 属性之类的%……&×(,不知所云了。。。
def digest_for(logical_path)
。。。。
if compile_assets
if digest_assets && asset = asset_environment[logical_path]
return asset.digest_path
end
return logical_path
else
raise AssetNotPrecompiledError.new("#{logical_path} isn't precompiled")
end
end