Rails

【Rails】各環境の共通設定をRails::Application.config_forを用いてyml形式で管理する方法

Rails

 

今回は各環境(development, test, staging, production)の共通設定をRails::Application.config_forを用いてyml形式で管理する方法についてまとめたので解説したいと思います。

Rails::Application.config_forを用いた管理方法

ymlファイルの配置

まずはymlファイルをconfig直下に配置します。今回はリンクを管理するため、link.ymlというファイルを配置します。

config
 - link.yml
ファイル名はよしなに変更してください。

各環境の記載

先ほど作成したlink.ymlに各環境の設定を記載します。共通の環境で用いる設定はdefaultに記載され、各環境それぞれでdefaultを読み込む形になっています。

# config/link.yml

# 共通の設定
default: &default

# 開発環境の設定
development:
  <<: *default

# テスト環境の設定
test:
  <<: *default

# 本番環境の設定
production:
  <<: *default

# ステージング環境の設定
staging:
  <<: *default

共通設定の記載

続いて、先ほど記述したdefault部分に共通で用いる設定を記載します。今回は試しにGoogleとYahooのリンクを追記しました。

# config/link.yml

# 共通の設定
default: &default
  google:
    https://www.google.com/
  yahoo:
    ja:
      https://www.yahoo.co.jp/
    en:
      https://www.yahoo.com/

# 開発環境の設定
development:
  <<: *default

# テスト環境の設定
test:
  <<: *default

# 本番環境の設定
production:
  <<: *default

# ステージング環境の設定
staging:
  <<: *default

以下のようにネストすることも可能です。

yahoo:
  ja:
    https://www.yahoo.co.jp/
  en:
    https://www.yahoo.com/

ymlファイルの読み込み

最後にlink.ymlを読み込む記述をapplication.rbに追記します。

require_relative 'boot'

require 'rails/all'

# Require the gems listed in Gemfile, including any gems
# you've limited to :test, :development, or :production.
Bundler.require(*Rails.groups)

module SlackNotificationApp
  class Application < Rails::Application
    # Initialize configuration defaults for originally generated Rails version.
    config.load_defaults 6.0

    # Settings in config/environments/* take precedence over those specified here.
    # Application configuration can go into files in config/initializers
    # -- all .rb files in that directory are automatically loaded after loading
    # the framework and any gems in your application.

    config.x.link = config_for(:link) ← 追記
  end
end

ネストされた状態ではconfig.x.linkのようにxを挟む必要があります。

> config.link
NoMethodError: undefined method `link' for #<Rails::Application::Configuration:0x00007f903e2e2220>

> config.x.link
{:google=>"https://www.google.com/", :yahoo=>{:ja=>"https://www.yahoo.co.jp/", :en=>"https://www.yahoo.com/"}}

> config.x.link.google
"https://www.google.com/"

参考: Railsガイド 8カスタム設定

リンクの取得

link.ymlで設定した記述をコントローラー等で引っ張りたい場合は「Rails.configuration.x…」で呼び出すことができます。

def google_url
  Rails.configuration.x.link.google
end

def yahoo_ja_url
  Rails.configuration.x.link.yahoo[:ja]
end

def yahoo_en_url
  Rails.configuration.x.link.yahoo[:en]
end

まとめ

  • 共通の環境で用いる設定はdefaultに記載する
  • ymlファイルではネストして記述することも可能
  • ネストされた状態ではconfig.x.linkのようにxを挟む必要がある
  • ymlファイルで設定した記述はRails.configuration.x…で呼び出せる

参考

 

 

今回は各環境(development、test、production…)の共通設定をRails::Application.config_forを用いてyml形式で管理する方法について解説しました。1つにまとめられそうな設定があれば、Rails::Application.config_forを使ってみてください。