Как отобразить переменные окружения как группу в Rails - PullRequest
0 голосов
/ 26 марта 2019

Я использую приложение Rails 5.2. Я хочу отобразить переменные среды как группу в конечной точке.

env_controller.rb

class EnvController < ApplicationController
  def index
   render json: ENV.to_h
  end
end

Когда я загружаю http://localhost:3000/env, я вижу следующий результат

{
  "XDG_VTNR": "7",
  "MANPATH": "/home/ubuntu/.nvm/versions/node/v4.6.0/share/man:/home/ubuntu/.rvm/rubies/ruby-2.6.2/share/man:/home/ubuntu/.rvm/man:/usr/lib/jvm/java-8-oracle/man:/usr/local/man:/usr/local/share/man:/usr/share/man",
  "S3_SOURCE_PATH": "dev/source",
  "DB_ENV_USER": "postgres",
  "XDG_SESSION_ID": "c2",
  "rvm_bin_path": "/home/ubuntu/.rvm/bin",
  "S3_DESTINATION_PATH": "dev/destination",
  "SESSION": "ubuntu",
  "DB_PORT_5432_TCP_ADDR": "localhost",
  "S3_REGION": "us-east-1"
}

Я хочу сгруппировать переменные среды следующим образом. Мой ожидаемый результат выглядит следующим образом

{
  "S3": {
    "S3_SOURCE_PATH": "reports/source",
    "S3_DESTINATION_PATH": "reports/destination",
    "S3_REGION": "us-east-1"
  },
  "DB": {
    "DB_ENV_USER": "postgres",
    "DB_PORT_5432_TCP_ADDR": "localhost"
  },
  "Others": {
    "XDG_VTNR": "7",
    "MANPATH": "/home/ubuntu/.nvm/versions/node/v4.6.0/share/man:/home/ubuntu/.rvm/rubies/ruby-2.6.2/share/man:/home/ubuntu/.rvm/man:/usr/lib/jvm/java-8-oracle/man:/usr/local/man:/usr/local/share/man:/usr/share/man",
    "XDG_SESSION_ID": "c2",
    "rvm_bin_path": "/home/ubuntu/.rvm/bin",
    "SESSION": "ubuntu"
  }
}

Мне определенно нужно сгруппировать "S3" и "DB". Есть больше переменных в моем приложении, которые должны быть сгруппированы следующим образом. Выше образцы.

Как я могу отобразить это, как указано выше?

1 Ответ

1 голос
/ 26 марта 2019

Я думаю, что вы хотите, это пользовательский сериализатор. Нечто похожее на это:

class EnvSerializer
  def as_json
    {
      S3: env_select('S3'),
      DB: env_select('DB'),
      Other: env_reject('S3', 'DB')
    }
  end

  private

  def env_select(prefix)
    ENV.select { |k, v| k.start_with?(prefix) }
  end

  def env_reject(*prefixes)
    ENV.reject { |k, v| k.start_with?(*prefixes) }
  end
end

Что бы выглядело так в контроллере:

class EnvController < ApplicationController
  def index
    render json: EnvSerializer.new.as_json
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...