Не удается переопределить метод помощника Spree

#ruby-on-rails #spree

#ruby-on-rails #spree

Вопрос:

Почему мой код не переопределяет код Spree?

app/helpers/spree/frontend_helper_decorator.rb

 Spree::FrontendHelper.module_eval do

    def taxons_tree(root_taxon, current_taxon, max_level = 1)
      return '' if max_level < 1 || root_taxon.children.empty?
      content_tag :ul, class: 'taxons-list' do
        root_taxon.children.map do |taxon|
          css_class = (current_taxon amp;amp; current_taxon.self_and_ancestors.include?(taxon)) ? 'current' : nil
          content_tag :li, class: css_class do
           link_to(taxon.name, seo_url(taxon))  
           taxons_tree(taxon, current_taxon, max_level - 1)
          end
        end.join("n").html_safe
      end
    end

end
 

Комментарии:

1. Можете ли вы попробовать переименовать свой файл в frontend_helper.rb ?

2. ошибка @MrShemek: Circular dependency detected while autoloading constant Spree::FrontendHelper

3. Не могли бы вы изменить первую строку на: module Spree::FrontedHelper (удалить module_eval блок)?

4. @MrShemek я делал это раньше. Это приводит к проблеме, заключающейся в том, что работает только мой пользовательский метод, а другие из Spree ::FrontendHelper — нет.

5. @MrShemek я нашел решение, см. Мой ответ)

Ответ №1:

У вас это было в вашем application.rb ?

 config.to_prepare do
  # Load application's model / class decorators
  Dir.glob(File.join(File.dirname(__FILE__), "../app/**/*_decorator*.rb")) do |c|
    Rails.configuration.cache_classes ? require(c) : load(c)
  end

  # Load application's view overrides
  Dir.glob(File.join(File.dirname(__FILE__), "../app/overrides/*.rb")) do |c|
    Rails.configuration.cache_classes ? require(c) : load(c)
  end
end
 

Комментарии:

1. нет, почему он должен быть у меня? есть ли какой-нибудь документ об этом?

2. При выполнении rails g spree:install добавляется в application.rb. Проверьте github.com/spree/spree/blob/master/core/lib/generators/spree /…

3. Спасибо за объяснение. Не знаю, почему мой application.rb пропускает эти строки…

Ответ №2:

Посмотрите принятый ответ выше

Итак, это сработало после того, как я добавил файл декоратора в качестве требования к инициализатору:

spree.rb

 require "#{Rails.root}/app/helpers/spree/frontend_helper_decorator.rb"
 

Чтобы добавить декоратор всех помощников, я использую этот код:

 Dir["#{Rails.root}/app/helpers/spree/*.rb"].each {|file| require file }
 

Не забудьте перезапустить сервер после этого изменения!