Ruby on rails Rails-从Rails配置中获取名称空间常量
假设我有几个搜索引擎的实现Ruby on rails Rails-从Rails配置中获取名称空间常量,ruby-on-rails,ruby,ruby-on-rails-5,Ruby On Rails,Ruby,Ruby On Rails 5,假设我有几个搜索引擎的实现 module Searcher module Engine class Elasticsearch end class Algolia end end end 我想要每个环境的搜索引擎配置 我在我的环境中声明了配置(对于某种桥接模式) (我将在特定环境文件中覆盖该文件) 然后在我的搜索控制器中,我想根据我在Rails.configuration.search_engine中输入的符号加载适当的类 @search_engine
module Searcher
module Engine
class Elasticsearch
end
class Algolia
end
end
end
我想要每个环境的搜索引擎配置
我在我的环境中声明了配置(对于某种桥接模式)
(我将在特定环境文件中覆盖该文件)
然后在我的搜索控制器中,我想根据我在Rails.configuration.search_engine中输入的符号加载适当的类
@search_engine = Searcher::Engine::XXX
@search_engine.search
如何从符号:elasticsearch
解析完整的命名空间常量Searcher::Engine::XXX
编辑:
Searcher::Engine.const_get(Rails.configuration.search_engine.to_s.titleize)
不工作:它加载Elasticsearch
(来自gem)而不是search::Engine::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这很奇怪。。。在rails控制台中试试Object.const_get(“::Searcher::Engine::{'elasticsearch.titleize}”)Object.const_get(“::Searcher::Engine::elasticsearch”)=>elasticsearch
@CyrilDuchon Doris。。只是出于好奇-我想你做的是Searcher::Engine.const_-get(Rails.configuration.search_-Engine.to_.titleize,false)
或Object.const_-get(“::Searcher::Engine::{Rails.configuration.search_-Engine.to_.to_.titleize}”,false)
或Object.qualified_-const_-get(::Searcher::Engine:::#{Rails.configuration.search\u engine.to\u s.titleize}“
或search::engine.qualified\u const\u get(Rails.configuration.search\u engine.to\u s.titleize)
?
::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
"::Searcher::Engine::#{Rails.configuration.search_engine.to_s.titleize}".constantize