Контроллер Rails не загружает расширенный класс - PullRequest
0 голосов
/ 17 июня 2020

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

Content:

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

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

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

Обновление:

Я создал:

# 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

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

Ответы [ 2 ]

2 голосов
/ 17 июня 2020

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

# 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
0 голосов
/ 17 июня 2020

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

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

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

...