Rails - 从Rails配置获取命名空间常量
问题描述:
假设我有几个搜索引擎实现。Rails - 从Rails配置获取命名空间常量
module Searcher
module Engine
class Elasticsearch
end
class Algolia
end
end
end
我想要一个每个环境的搜索引擎配置。
我宣布我的环境的配置(对某种桥模式)
Rails.application.configure do
config.search_engine = :elasticsearch
end
(这是我在特定的环境文件覆盖)
然后在我的搜索控制器,我想加载根据我把Rails.configuration.search_engine
@search_engine = Searcher::Engine::XXX
@search_engine.search
如何解决全命名空间的不断Searcher::Engine::XXX
FR符号适当类om符号:elasticsearch
?
编辑:
Searcher::Engine.const_get(Rails.configuration.search_engine.to_s.titleize)
不起作用:它加载Elasticsearch
(从创业板),而不是Searcher::Engine::Elasticsearch
(我自己的分量)
::Searcher::Engine::Elasticsearch # => Searcher::Engine::Elasticsearch
Searcher::Engine.const_get(Rails.configuration.search_engine.to_s.titleize) # => Elasticsearch
Object.const_get("::Searcher::Engine::#{Rails.configuration.search_engine.to_s.titleize}") # => Elasticsearch
的Ruby 2.3.0 Rails的5
答
假设您的搜索引擎全部在::Searcher::Engine
之下:
"::Searcher::Engine::#{Rails.configuration.search_engine.to_s.titleize}".constantize
它似乎没有工作,它仍然在这里解决了'Elasticsearch:Module' ...键入':: Searcher :: Engine :: Elasticsearch'确实可以工作,所以常量真的在这里。 –
@ CyrilDuchon-Doris这是奇怪的...尝试在轨道控制台'Object.const_get( “:: Searcher :: Engine ::#{'elasticsearch'.titleize}” )' –
'Object.const_get(“::搜索器::引擎:: Elasticsearch“) => Elasticsearch' –