[英]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.