【问题标题】:Rails controller not loading extended classRails 控制器未加载扩展类
【发布时间】:2020-06-17 06:54:42
【问题描述】:

我在一个小项目中使用 rails (5.0.7.2)。对于标签,我选择acts-as-taggable-on 和搜索 pg_search gems。由于我希望标签是可搜索的,我首先在应用程序目录中创建了一个名为“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

但是,如果我想在标签控制器中的标签上使用该搜索功能,我会收到“方法未定义”错误。如果我包含右上方文件中的代码 在控制器动作中它正常工作。因此我猜它可能根本没有加载 从那个新文件夹中。

使扩展程序中的内容可供访问的正确方法是什么? 我的控制器?

更新:

我创造了:

# 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

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

【问题讨论】:

    标签: ruby-on-rails acts-as-taggable-on pg-search


    【解决方案1】:

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

    # 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
    

    【讨论】:

    • 我不确定这是否真的有效。 ActsAsTaggableOn 的模型在 gem 本身中,而不是在我的项目文件夹中。因此,模型评估的技巧是打开类并添加一个功能。我不能简单地包括一些东西,但也许我误解了你。
    • 您可以创建 app/models/act_as_taggable_on/tag.rb 文件,然后它应该重新打开它,或者您可以使用 class_eval 做你的伎俩并包含关注点。
    • 不错。谢谢!
    【解决方案2】:

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

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

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

    【讨论】:

    • 你是对的。 app/ 中的所有内容都是自动加载的。即使不必明确指定文件夹(如您所建议的那样)。我发现添加到自动加载路径的新文件夹。但是该文件夹中文件的功能似乎没有运行或导入。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-16
    • 1970-01-01
    • 2012-01-10
    • 2021-04-25
    • 1970-01-01
    相关资源
    最近更新 更多