我正在尝试覆盖 Solidus 代码并想知道我的选择是什么?
特别是我正在尝试更改地址以使电话可选。
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自动拾取。
原答案:
app/models/spree
如果需要,在额外的 spree 命名空间下创建一个文件并添加额外的命名空间config/initializers/spree.rb
在实际问题中——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