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
Попробуйте изменить имя файла. Это, безусловно, решит вашу проблему.
Дайте мне знать, если у вас все еще есть проблемы.