Rails控制器未加载扩展类

问题描述 投票:0回答:2

我正在将Rails(5.0.7.2)用于一个小型项目。对于标记,我选择“行为可标记”,对于搜索pg_search宝石。因为我希望标签可搜索,所以我首先在应用程序目录中创建了一个名为“实用程序”的文件夹。然后,我在该文件夹中创建了一个名为“ 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

我删除了Utility文件夹和文件。现在在标签控制器中]

class ActsAsTaggableOn::Tag
  include Searchable
end

这有效,看起来更好一些。但是不是最佳的。至少有类调用并且包含在控制器中感觉不好。

ruby-on-rails acts-as-taggable-on pg-search
2个回答
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

0
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.