簡體   English   中英

導軌 controller 未加載擴展 class

[英]Rails controller not loading extended class

我在一個小項目中使用 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

但是,如果我想在我的標簽 controller 中的標簽上使用該搜索 function,我會收到“方法未定義”錯誤。 如果我在 controller 操作中包含上面文件中的代碼,它可以正常工作。 因此我猜它可能根本沒有從那個新文件夾中加載。

將擴展中的內容提供給我的 controller 的正確方法是什么?

更新:

我建立:

# 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

我刪除了實用程序文件夾和文件。 在標簽 controller 現在我做

class ActsAsTaggableOn::Tag
  include Searchable
end

這有效並且看起來更好一些。 然而不是最優的。 至少讓 class 調用並包含在 controller 中感覺不太好。

我認為更好的方法可能是將其轉移到關注點中,並將關注點包含在您的 model 中(默認情況下應該自動加載關注點)。 這樣的事情可能會奏效。

# 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

默認情況下, app/中的所有內容都是自動加載的,但在config/application.rb中您可以添加:

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

也包括公用事業。 或者您可以在config/environments/...中執行此操作,以針對每個環境執行此操作

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM