Rails 控制器未加载扩展 class

Rails controller not loading extended class

我正在为一个小项目使用 rails (5.0.7.2)。对于标签,我选择 acts-as-taggable-on 和搜索 pg_search 宝石。由于我希望标签可搜索,因此我首先在应用程序目录中创建了一个名为 "utilities" 的文件夹。然后我在该文件夹中创建了一个名为 "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

但是,如果我想在我的标签控制器中的标签上使用该搜索功能,我会收到 "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

这有效,而且看起来更好一些。然而不是最优的。至少让 class 调用并包含在控制器中感觉不太好。

默认情况下,app/ 中的所有内容都是自动加载的,但在 config/application.rb 中,您可以添加:

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

也包括实用程序。或者您可以在 config/environments/... 中根据每个环境执行此操作

我认为更好的方法可能是将其转化为关注点并将关注点包含在您的模型中(默认情况下应该自动加载关注点)。这样的事情可能会奏效。

# 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