狂欢 - 无法覆盖js.coffee文件

时间:2014-05-03 09:24:31

标签: javascript ruby-on-rails coffeescript override spree

只需按照http://guides.spreecommerce.com/developer/asset.html的说明操作,但它不起作用。包含并加载了新的js文件,但是如果我创建具有相同名称的文件,则说无论如何都加载了product.js.coffee原始文件。有什么建议吗?

All.js

//= require jquery
//= require jquery_ujs
//= require spree/frontend
//= require_tree .

2 个答案:

答案 0 :(得分:3)

我整个早上都在解决这个问题。

最终对我有用的是在/app/assets/javascripts/spree/frontend/all.js中指定我想要覆盖的每个文件。

例如,如果您要覆盖cart.js.coffeecheckout/address.js.coffee,您的all.js应如下所示:

//= require jquery
//= require jquery_ujs
//
//= require spree/frontend
//= require spree/frontend/cart
//= require spree/frontend/checkout/address
//
//= require_tree .

不要问我为什么这么做。我的理解是//= require_tree .应该自动执行此操作,但我的情况是,它不是。

创建all.js文件并冗余地指定每个文件后,这最终对我有用。但我是一个狂欢/铁路菜鸟,所以这可能是一个更好的解决方案。

编辑:

实际上,为了实现这一目标,我必须将上述内容放在/vendor/assets/javascripts/spree/frontend/all.js中并删除/app/assets/javascripts/spree/frontend/all.js。仍然困惑为什么这是必要的,为什么require_tree不会自动选择这些,但很高兴终于让它发挥作用。

答案 1 :(得分:1)

Backporting this patch for Solidus 2.1.0 解决了我替换/覆盖 JS 资产 [1] 的问题。

问题似乎是 Sprockets 存在一个问题,即使用 require_tree 或相关 require 会阻止管道中的 JS 资产被覆盖。

总结

  1. 在您项目的供应商/资产下创建一个新文件,文件名与您将在 Solidus 中替换的 JS 文件相同。例如,要覆盖文件 solidus_backend/app/assets/javascripts/spree/backend/flash.coffee,请在项目中的 your_project/{app,vendor}/assets/javascripts/spree/backend/flash.coffee 处创建一个替换文件。 [2]

  2. 在您的项目中创建文件 your_project/{app,vendor}/assets/javascripts/spree/backend.jsyour_project/{app,vendor}/assets/javascripts/spree/backend/templates/index.js

  3. backend.jsindex.js 文件的内容从 solidusio/solidus#1613 复制到您的项目中。

  4. 删除 Solidus 版本中不存在的文件的任何要求,如果您已经定义了 backend.jsindex.js,则保留所有自定义要求。 [3]


脚注

  1. 包括 .js、.coffee、.hbs 以及在资产管道编译期间编译为 JavaScript 的任何其他文件。

  2. 您项目中 {app,vendor}/assets 之间的任一目录都可以使用,因为它们都应该在资产管道加载路径中。您希望如何组织 Solidus 扩展和覆盖取决于您的偏好。

  3. 我必须从 spree/backend/images/upload 中删除 backend.js 和来自 spree/backend/templates/products/upload_progressindex.js,因为我使用的是旧版本的 Solidus 并且这些文件尚不存在,所以我会从 Sprockets 收到 FileNotFound 错误。