Rails - 从Rails配置获取名称空间常量

时间:2016-09-26 08:54:49

标签: ruby-on-rails ruby ruby-on-rails-5

假设我有几个搜索引擎实现。

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解析完整的命名空间常量:elasticsearch

编辑:

Searcher::Engine.const_get(Rails.configuration.search_engine.to_s.titleize)

不起作用:它加载Elasticsearch(来自gem)而非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

1 个答案:

答案 0 :(得分:1)

假设您的搜索引擎全部在::Searcher::Engine下:

"::Searcher::Engine::#{Rails.configuration.search_engine.to_s.titleize}".constantize