1

我正在尝试覆盖 Solidus 代码并想知道我的选择是什么?

特别是我正在尝试更改地址以使电话可选。

4

1 回答 1

2

Solidus 旨在提供更好的自定义界面——他们希望避免你打开 Solidus/Spree 类——因为它增加了你破坏系统的机会。

Rails 6.0(Zeitwerk 更改)的原始答案被打破。对于 Rails 6,有未经测试的示例代码取自 github 问题。

# app/decorators/your_app/spree/address/make_phone_optional_decorator.rb
module YourApp::Spree::Address::MakePhoneOptionalDecorator
  def require_phone?
    false
  end

  Spree::Address.prepend self
end

一定要给文件命名*_decorator.rb,像这样它们会被solidus自动拾取。


原答案:

从最喜欢到最不喜欢列出的替代品

  1. 为此,他们提供了扩展点
  2. 装饰器
    • 这对我们没有帮助,因为地址在 Solidus 库中起作用,而不是在我们的应用程序中调用的代码
  3. 模块#prepend
    • 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

配置/初始化程序/spree.rb

#
# Customization of Spree Code
#

Spree::Address.prepend Spree::OptionalPhoneAddress

笔记

进一步研究

于 2017-03-22T13:28:21.380 回答