【问题标题】:Spree - cannot override js.coffee fileSpree - 无法覆盖 js.coffee 文件
【发布时间】:2014-06-19 23:42:37
【问题描述】:

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

所有.js

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

【问题讨论】:

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


    【解决方案1】:

    我整个早上都在为这个问题烦恼。

    最后对我有用的是在/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 文件并冗余指定每个文件后,这终于对我有用。但我是一个 spree/rails 菜鸟,所以很可能有更好的解决方案。

    编辑:

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

    【讨论】:

    • 在我的场景中,我试图在 Solidus 中覆盖 app/assets/javascripts/spree/backend/flash.coffee。在我的项目中定义vendor/assets/javascripts/spree/backend/flash.coffee并将//= require spree/backend/flash添加到vendor/assets/javascripts/spree/backend/all.js并没有覆盖原来的JS代码,它只是添加了新的JS代码。要删除旧的 JS 代码,还必须通过在我的项目中定义 vendor/assets/javascripts/spree/backend.js 来覆盖 //= require spree/backend 调用。
    【解决方案2】:

    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. 我必须从 backend.js 中删除 spree/backend/images/upload 和来自index.jsspree/backend/templates/products/upload_progress,因为我使用的是旧版本的Solidus 并且这些文件还不存在,所以我会从Sprockets 收到FileNotFound 错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-11
      • 1970-01-01
      • 2012-08-12
      • 2014-03-31
      • 1970-01-01
      • 1970-01-01
      • 2013-07-21
      • 2017-09-20
      相关资源
      最近更新 更多