Override Controller в Spree - обнаружена циклическая зависимость при автозагрузке константы

Я пытаюсь добавить действие в Spree Admin PromotionsController, как это

приложение / контроллеры / Шпрее / админ / promotions_controller.rb

Spree::Admin::PromotionsController.class_eval do

  def users
    params[:q] ||= {}
    @search = @promotion.orders.reverse_chronological.ransack(params[:q])

    @users_hash = Hash.new(0)
    @search.result.each { |order| @users_hash[order.user] += 1 }

    @users_hash = Kaminari.paginate_array(@users_hash.to_a).page(params[:page])
  end
end

Но я получаю эту ошибку:

Обнаружена циклическая зависимость при автозагрузке константы Spree:: Admin:: PromotionsController

Также я попытался полностью переопределить контроллер:

 module Spree
   module Admin
     class PromotionsController < ResourceController
       before_action :load_data

       helper 'spree/admin/promotion_rules'
       def users
         params[:q] ||= {}
         @search = 
         @promotion.orders.reverse_chronological.ransack(params[:q])

         @users_hash = Hash.new(0)
         @search.result.each { |order| @users_hash[order.user] += 1 }

         @users_hash = 
         Kaminari.paginate_array(@users_hash.to_a).page(params[:page])
       end

       protected

       def location_after_save
         spree.edit_admin_promotion_url(@promotion)
       end

       def load_data
         @calculators = Rails.application.config.spree.calculators.promotion_actions_create_adjustments
         @promotion_categories = Spree::PromotionCategory.order(:name)
       end

       def collection
         return @collection if defined?(@collection)
         params[:q] ||= HashWithIndifferentAccess.new
         params[:q][:s] ||= 'id desc'

         @collection = super
         @search = @collection.ransack(params[:q])
         @collection = @search.result(distinct: true)
                         .includes(promotion_includes)
                         .page(params[:page])
                         .per(params[:per_page] || 
        Spree::Config[:admin_promotions_per_page])
      end

      def promotion_includes
        [:promotion_actions]
      end
   end
 end

Это работает отлично, но выглядит как костыли

Любая помощь будет высоко ценится, спасибо

маршруты:

Spree::Core::Engine.routes.draw do
  Spree::Core::Engine.add_routes do
    namespace :admin do
      resources :promotions, only: [] do
        member do
          get 'users'
        end
      end
    end
  end
end

1 ответ

Решение

Проблема с именем файла app/controllers/spree/admin/promotions_controller.rb

В spree всякий раз, когда мы делаем class_eval на контроллере / модели, мы создаем файл с именем 'original_filenanme_decorator.rb'

т.е. app/controllers/spree/admin/promotions_controller_decorator.rb

Spree::Admin::PromotionsController.class_eval do

  def users
    params[:q] ||= {}
    @search = @promotion.orders.reverse_chronological.ransack(params[:q])

    @users_hash = Hash.new(0)
    @search.result.each { |order| @users_hash[order.user] += 1 }

    @users_hash = Kaminari.paginate_array(@users_hash.to_a).page(params[:page])
  end
end

Попробуйте изменить имя файла. Это, безусловно, решит вашу проблему.

Дайте мне знать, если у вас все еще есть проблемы.

Другие вопросы по тегам