Контроллер Rails не загружает расширенный класс

Я использую рельсы (5.0.7.2) для небольшого проекта. Для тегов я выбираю act-as-taggable-on, а для поиска pg_search gems. Поскольку я хочу, чтобы теги были доступны для поиска, я сначала создал папку в каталоге приложения под названием «утилиты». Затем я создал в этой папке файл с именем «search_tags.rb».

Контент:

ActsAsTaggableOn::Tag.class_eval do
  # includes
  include PgSearch

  # search scope
  pg_search_scope :search, against: {
    name: 'A',
  },
  using: {
    tsearch: {
      dictionary: 'english',
      prefix: true
    }
  }

  class SearchTags; end

end

Однако, если я хочу использовать эту функцию поиска для тегов в моем контроллере тегов, я получаю ошибку «метод не определен». Если я включаю код из файла выше прямо в действие контроллера, он работает правильно. Таким образом, я предполагаю, что он может вообще не загружаться из этой новой папки.

Каким будет правильный способ сделать контент из расширения доступным для моего контроллера?

Обновлять:

Я создал:

# app/models/concerns/searchable.rb
module Searchable
  extend ActiveSupport::Concern

  included do
    include PgSearch

    # search scope
    pg_search_scope :search, against: {
      name: 'A',
    },
    using: {
      tsearch: {
        dictionary: 'english',
        prefix: true
      } 
    }
  end
end

Я удалил папку утилит и файл . В контроллере тегов сейчас делаю

class ActsAsTaggableOn::Tag
  include Searchable
end

Это работает и выглядит немного лучше. Однако не оптимально. По крайней мере, не очень хорошо иметь вызов класса и включать его в контроллер.


person Claas-Thido Pfaff    schedule 17.06.2020    source источник


Ответы (2)


Я думаю, что лучшим подходом может быть перенос этого в проблему и включение проблемы в вашу модель (проблемы должны загружаться автоматически по умолчанию). Что-то вроде этого может сработать.

# app/models/concerns/searchable.rb
module Searchable
  extend ActiveSupport::Concern

  included do
    include PgSearch

    # search scope
    pg_search_scope :search, against: {
      name: 'A',
    },
    using: {
      tsearch: {
        dictionary: 'english',
        prefix: true
      } 
    }
  end
end
# app/models/act_as_taggable_on/tag.rb
class ActsAsTaggableOn::Tag
  include Searchable
end
person Christian Bruckmayer    schedule 17.06.2020
comment
Я не уверен, действительно ли это работает. Модель ActsAsTaggableOn находится в самом геме, а не в папке моего проекта. Таким образом, трюк с оценкой модели открывает класс и добавляет функцию. Я не могу просто включить что-то там, но, возможно, я вас неправильно понял. - person Claas-Thido Pfaff; 17.06.2020
comment
Вы можете создать файл app/models/act_as_taggable_on/tag.rb, и он должен открыть его снова, или вы сделаете свой трюк с class_eval и включите проблему. - person Christian Bruckmayer; 17.06.2020
comment
Хороший. Благодарю вас! - person Claas-Thido Pfaff; 18.06.2020

По умолчанию все в app/ загружается автоматически, но в config/application.rb вы можете добавить:

config.autoload_paths += %W(#{config.root}/utilities/)

чтобы включить коммунальные услуги, а также. Или вы можете сделать это в config/environments/..., чтобы сделать это для каждой среды отдельно.

person johansenja    schedule 17.06.2020
comment
Ты прав. Все в app/ загружается автоматически. Даже без явного указания папки (как вы предлагаете). Я нахожу новую папку, добавленную в пути автозагрузки. Но функция из файла в этой папке, похоже, не запускается и не импортируется. - person Claas-Thido Pfaff; 17.06.2020