SuperAPI AI 工具集

spree-decorators

通用与其它

查看项目

更新于 10-15 23:57

技能介绍

用途:在不 fork Spree 6 的前提下扩展已有模型或 API 控制器,适合做结构性改动(关联、校验、作用域、只读辅助方法、收窄控制器 scope),不适合承载业务行为。

主要能力:模型装饰器可添加 belongs_to/has_many 关联、validates 校验、scope、类方法,并覆写只读方法(需调用 super);控制器装饰器可覆写 scope、serializer_class、collection_includes、resource_permitted_attributes、model_class 等受保护钩子。

使用方式:命令使用 Spree CLI(spree …),经典 Rails 应用用 bin/rails g …。生成器:spree generate model_decorator Spree::Product、spree generate controller_decorator Spree::Api::V3::Admin::ProductsController。装饰器由 config/application.rb 中 config.to_prepare 块通过 glob app/**/_decorator.rb 加载,缺少该块需自行添加,否则 Zeitwerk 不会加载未引用文件。新增可写属性用 Spree::Product.additional_permitted_attributes += [:brand_id](必须用 += 或 |=)。可过滤字段用 Spree.ransack.add_attribute(Spree::Product, :brand_id)。

限制:不要装饰业务动词(Order#finalize!、Order#cancel、Payment#capture!、Fulfillment#finalize!),它们已废弃并委托给工作流;操作级规则应放入 workflow validate 钩子;保存后同步等应使用事件订阅者;新增端点应继承 ResourceController;API 装饰器必须返回 JSON。常见陷阱包括忘记 super、prepended 中使用实例变量、belongs_to 未加 optional: true、文件与模块路径不匹配、装饰 Spree::Order 处理结账逻辑(结账前状态属于 Spree::Cart)。Spree.user_class 已废弃,应装饰 Spree.customer_class 或 Spree.admin_user_class。更多细节见官方 decorators.md 等文档。