Railsでカスタム設定を扱う場合、以下に記載したSettingslogic
やGlobal
を使うことが多かったんですが、Rails標準のconfig_for
を使っても同じようなことが出来たので、使い方とかをMEMOしておきます📝
ちなみに、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)
上記の通り、config.foo
とすることで独自にRails.configuration.foo
として独自にApplicaitonでグローバルに参照出来る値を定義出来るのですが、config_for(:for)
とする事によって、config/foo.yml
に設定された内容を、そのまま定義することができます⚙
実際の処理の中身は以下のAPI documentから参照できます。
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
を使っても良さそうですね、便利✨