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
我正在为一个小项目使用 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