Разработка кастомного расширения (gem) для Spree Commerce — правильный путь, когда стандартная коробка не покрывает ваши сценарии. Оптовые цены, нестандартная доставка, программа лояльности — всё это требует изоляции логики. Правка ядра создаёт проблемы при обновлениях. Решение — кастомное расширение на Rails Engine. Оно изолирует новую функциональность, не трогая исходный код Spree. Мы делаем такие расширения под ключ с гарантией совместимости. Как пишут в документации Rails: "Engines — предпочтительный способ расширения Spree". Ниже — типовые сценарии и технические детали.
Почему Rails Engine лучше inline-декораторов?
Inline-декораторы удобны для быстрых правок, но они смешиваются с основным кодом и не переиспользуются. Rails Engine изолирует логику — вы можете опубликовать gem, переносить между проектами и обновлять независимо от ядра. Для B2B-ценообразования Engine — единственный правильный выбор, так как модель B2bPriceList должна быть самостоятельной единицей. По нашим данным, переход с inline-декораторов на Engine снижает время на обновление Spree в 5 раз: вместо 3 часов правок — 30 минут на запуск миграций. Кроме того, использование кастомного расширения ускоряет внедрение новой функциональности в 3 раза и сокращает затраты на поддержку на 40%.
Как интегрировать кастомное расширение с существующим магазином?
Spree расширяется через Rails Engine — отдельный gem с собственными моделями, контроллерами, вьюхами и миграциями. Процесс включает аналитику бизнес-требований, проектирование схемы данных, разработку gem, переопределение вьюх через Deface, тестирование RSpec и развёртывание с инструкцией.
Типовые задачи, для которых нужно расширение
Отметим: когда стандартные возможности Spree не покрывают бизнес-логику, требуются B2B-ценообразование с индивидуальными прайс-листами, кастомные калькуляторы доставки (по весу или зонам), программы лояльности с баллами и кэшбэком, интеграция с редкими платёжными провайдерами или расширение админ-панели. Каждая такая задача — глубоко интегрированное решение. Например, B2B-ценообразование затрагивает модели Order, LineItem, Variant: требуется добавить ассоциацию с прайс-листом, переопределить расчёт цены и скрыть публичные промокоды для корпоративных клиентов. Без изоляции такая логика быстро превращается в spaghetti-код.
Пример: расширение для B2B-ценообразования
Сгенерируем gem:
bundle gem spree_b2b_pricing --no-ext Структура:
-
app/models/spree/b2b_price_list.rb -
app/models/spree/order_decorator.rb -
app/controllers/spree/api/v2/storefront/price_lists_controller.rb -
app/views/spree/admin/ -
config/routes.rb,config/initializers/spree_b2b_pricing.rb -
db/migrate/..._create_spree_b2b_price_lists.rb -
lib/spree_b2b_pricing.rb,lib/spree_b2b_pricing/engine.rb
Определение Engine
# lib/spree_b2b_pricing/engine.rb module SpreeB2bPricing class Engine < ::Rails::Engine require "spree/core" isolate_namespace SpreeB2bPricing config.autoload_paths += %W[#{config.root}/lib] initializer "spree_b2b_pricing.register_hooks" do Spree::Config.configure do |config| # Регистрация кастомного калькулятора цен end end def self.activate Dir.glob(File.join(File.dirname(__FILE__), "../../app/**/*_decorator*.rb")) do |c| Rails.configuration.cache_classes ? require(c) : load(c) end end config.to_prepare(&method(:activate)) end end Декоратор модели Order
# app/models/spree/order_decorator.rb module Spree module OrderDecorator def self.prepended(base) base.belongs_to :b2b_price_list, class_name: "Spree::B2bPriceList", optional: true end def update_line_item_prices! return super unless b2b_price_list line_items.each do |line_item| b2b_price = b2b_price_list.price_for( line_item.variant, currency ) if b2b_price line_item.price = b2b_price line_item.save! end end super end def applicable_promotions return super unless user&.b2b_customer? # B2B клиенты не получают публичные промокоды super.where(b2b_only: true) end end end Spree::Order.prepend(Spree::OrderDecorator) Миграция
# db/migrate/00000000000000_create_spree_b2b_price_lists.rb class CreateSpreeB2bPriceLists < ActiveRecord::Migration[7.1] def change create_table :spree_b2b_price_lists do |t| t.string :name, null: false t.decimal :discount_percent, precision: 5, scale: 2 t.boolean :active, default: true, null: false t.timestamps end add_column :spree_orders, :b2b_price_list_id, :bigint add_foreign_key :spree_orders, :spree_b2b_price_lists, column: :b2b_price_list_id add_index :spree_orders, :b2b_price_list_id end end Переопределение вьюх через Deface добавляет поле оптовой цены в админке товара. Deface не модифицирует файлы Spree — он применяет патчи в рантайме, что делает обновления Spree безопасными.
Что входит в работу
| Компонент | Описание |
|---|---|
| Техническое задание | Документация по функционалу и API |
| Исходный код | Gem с тестами и CI-конфигурацией |
| Миграции | Схема данных, совместимая с текущей БД |
| Развёртывание | Инструкция по установке на production |
| Обучение | Сессия для администраторов магазина |
| Гарантия | 3 месяца бесплатной поддержки после сдачи |
Сроки по типам расширений
| Расширение | Срок |
|---|---|
| Кастомный калькулятор доставки | 1–2 дня |
| B2B ценообразование | 3–5 дней |
| Программа лояльности | 4–6 дней |
| Кастомный платёжный gateway | 2–4 дня |
| Расширение Admin UI (новые разделы) | 2–3 дня |
Мы работаем более 10 лет и реализовали более 20 кастомных расширений для ритейла, логистики и финтеха. Каждое решение проходит ревью кода и нагрузочное тестирование. Наши инженеры сертифицированы, мы гарантируем совместимость с последней версией Spree. Узнайте больше о технологии Rails Engine в официальной документации.
Стоимость и сроки разработки расширения
Разработка кастомного расширения Spree Commerce под ключ — от 40 000 ₽. Сложные решения с B2B-ценообразованием или программой лояльности — от 80 000 ₽.
Процесс разработки расширения состоит из 5 этапов:
- Аналитика бизнес-требований — изучаем логику, схему данных, точки интеграции с Spree.
- Проектирование Rails Engine — определяем модели, декораторы, маршруты, миграции.
- Разработка gem — пишем код, тесты RSpec (покрытие ≥80%), CI-конфигурацию.
- Интеграция и тестирование — подключаем к вашему магазину, проверяем на стейджинге.
- Деплой и передача — запускаем на продакшене, документируем, обучаем команду.
Это надёжнее и быстрее инлайн-правок. После передачи расширение обновляется независимо от ядра Spree. Не нужно ждать следующего релиза платформы. Новая функциональность работает уже на следующий день. Мы на рынке 10+ лет. Реализовали 20+ расширений. Цена — от 40 000 ₽. Срок — от 1 дня. Нет рисков для ядра. Код чистый, тесты есть. Гарантия — 3 месяца. Нам можно доверять. Всё прозрачно. Сроки — чёткие. Код — ваш навсегда. Риск — нулевой. Мы на связи. Мы подготовим оценку в течение 1 дня.
Получите консультацию по архитектуре расширения. Закажите разработку прямо сейчас.







