Madogiwa Blog

主に技術系の学習メモに使っていきます。

Ruby on Rails: Rails標準の`config_for`を使ってカスタム設定を管理する⚙

Railsでカスタム設定を扱う場合、以下に記載したSettingslogicGlobalを使うことが多かったんですが、Rails標準のconfig_forを使っても同じようなことが出来たので、使い方とかをMEMOしておきます📝

github.com

github.com

ちなみに、Rails 6.1.3.2環境で試した内容のMEMOになります。

config_forとは?

config_forとは、Rails::Application#config_forに定義されているRails標準でカスタム設定を管理するための機能です。

Railsの設定オブジェクトをカスタマイズして独自のコードを設定するには、config.x名前空間かconfigの直下にコードを配置します。

  • config.super_debugger = true
  • Rails.configuration.super_debugger # => true

Rails::Application.config_forを使うと、設定ファイル全体を読み込むこともできます。

  • config.payment = config_for(:payment)

Rails アプリケーションを設定する - Railsガイド

上記の通り、config.fooとすることで独自にRails.configuration.fooとして独自にApplicaitonでグローバルに参照出来る値を定義出来るのですが、config_for(:for)とする事によって、config/foo.ymlに設定された内容を、そのまま定義することができます⚙

実際の処理の中身は以下のAPI documentから参照できます。

api.rubyonrails.org

config_forを使って設定値を管理する

管理用のyamlファイルを作成する

では実際にconfig_forを使って設定値を管理してみます。

今回はBASIC認証のuser/passwordをconfig_forで管理するようにしてみます。※credencialsを使ったほうが良い等もあるかもですが。。。

まずは設定値の管理用のyamlファイルを用意します。 ※後述の通りconfig_forで任意パスのファイルを読み込むことができますが、デフォルトの挙動は、config 直下の拡張子が.ymlのファイルを探して読み込まれます。

またyamlファイルはERBとして解釈されるため以下のような形で環境変数から値を読むこともできます。

# config/settings.yml
production:
  basic_auth:
    user: <%= ENV['BASIC_AUTH_USER'] %>
    password: <%= ENV['BASIC_AUTH_PASSWORD'] %>
development:
  basic_auth:
    user: <%= ENV['BASIC_AUTH_USER'] %>
    password: <%= ENV['BASIC_AUTH_PASSWORD'] %>
test:
  basic_auth:
    user: <%= ENV['BASIC_AUTH_USER'] %>
    password: <%= ENV['BASIC_AUTH_PASSWORD'] %>

作成したyamlファイルからconfig_forを使って設定する

設定値を参照出来るようにするには、config_forに引数として先程作成したファイルのファイル名をシンボルとして渡します。

module MyApp
  class Application < Rails::Application
    config.settings = config_for(:settings)

config直下では無く、任意の場所に作成した設定用のyamlファイルを読み込みたいときは以下のような形でPathnameインスタンスを渡してあげればOKです🆗

config.authentication = config_for(Rails.root.join('config/settings/authentication.yml'))

これで、以下のような形でBASIC認証に使用するuser/passwordを指定することできます✨

class ApplicationController < ApplicationController
  before_action :basic_auth

  private

  def basic_auth
    basic_auth_config = Rails.configuration.settings.basic_auth
    authenticate_or_request_with_http_basic do |user, password|
      user == basic_auth_config[:user] && password == basic_auth_config[:password]
    end
  end
end

おわりに

今までGemを使うことが多かったんですが、全然Rails標準のconfig_forを使っても良さそうですね、便利✨