Ruby on rails 自定义Solidus库代码-带有可选电话号码的地址

Ruby on rails 自定义Solidus库代码-带有可选电话号码的地址,ruby-on-rails,spree,solidus,Ruby On Rails,Spree,Solidus,我试图重写Solidus代码,想知道我的选项是什么 特别是,我正在尝试更改地址,使手机成为可选的。Solidus旨在提供更好的定制界面,因为它增加了您破坏系统的机会 最初的答案是Rails 6.0(Zeitwerk更改)的错误 请确保将文件命名为*\u decorator.rb,这样它们将由solidus自动拾取。 原始答复: 从最优先到最不优先列出的备选方案 为此,他们提供 装饰师 这对我们没有帮助,因为地址在Solidus库中起作用,而不是在我们的应用程序中调用代码 模块#前置

我试图重写Solidus代码,想知道我的选项是什么


特别是,我正在尝试更改地址,使手机成为可选的。

Solidus旨在提供更好的定制界面,因为它增加了您破坏系统的机会

最初的答案是Rails 6.0(Zeitwerk更改)的错误

请确保将文件命名为
*\u decorator.rb
,这样它们将由solidus自动拾取。


原始答复:

从最优先到最不优先列出的备选方案
  • 为此,他们提供
  • 装饰师
    • 这对我们没有帮助,因为地址在Solidus库中起作用,而不是在我们的应用程序中调用代码
  • 模块#前置
    • app/models/spree
      下创建一个文件,并根据需要预先添加其他spree名称空间
    • 将前缀添加到
      config/initializers/spree.rb
    • Prepend是对class_eval的改进,因为您可以使用super调用方法调用的非重写版本
  • 在实际的问题中——Spree地址没有扩展,因为我们没有调用代码(比如在我们编写的视图中),所以装饰程序将无法工作,因此我们需要使用prepend更改Spree代码

    app/models/spree/optional_phone_address.rb

    module Spree
      module OptionalPhoneAddress
        # require_phone?
        #   - no longer require a phone
        #   - a * no longer appears next to phone in the view
        #
        def require_phone?
          false
        end
      end
    end
    
    config/initializers/spree.rb

    #
    # Customization of Spree Code
    #
    
    Spree::Address.prepend Spree::OptionalPhoneAddress
    
    • 您已经改变了Solidus的性能,应该对其进行测试
    • Spree的google小组提出了解决这个问题的方法——我不知道这是否是新的维护者目前的做法
    进一步研究

    在最新的solidus/rails(2020:Rails6,solidus 2.10)中,这不再有效()。感谢@Felix-我没有使用solidus,但我剪切并粘贴了github版本中的示例代码。您可以随意更改答案,也可以让其他使用它的人随意更改答案。
    #
    # Customization of Spree Code
    #
    
    Spree::Address.prepend Spree::OptionalPhoneAddress