WEBアプリの各所で同じ値を使う場合、
定義は一か所に纏めて管理したいものです。
Rails には、標準で config_for という機能が用意されてます。
ただ、これも全ての場所はカバーしてないので、少々工夫します。
参考リポジトリ: https://github.com/Bonv-dev/book_mgmt/commit/586c517
一部、https://github.com/Bonv-dev/book_mgmt/commit/16545d3 も含む。
定数などの定義を管理する仕組みです。
\config フォルダに追加します。\config\my_settings.yml です。\config\application.rb に、config_for(:my_settings) です。config.x.settings に代入しておきましょう。config.x.settings = config_for(:my_settings).freeze以降は、サンプルプログラム前提で説明します。
ちなみに、
freeze は、オブジェクトの凍結(内容の変更を禁止)です。
定数は、途中で勝手に変えられると困るので。
ただ、完全に防止できるわけではないので、
詳細が必要な方は、Ruby リファレンスマニュアル を参照してください。
config.x は、WEBアプリ内で安全に使用できる領域です。
(Rails デフォルトの定義と衝突しないことが保証されています)
Rails.application.config.x.settings で参照できます。
リポジトリ: https://github.com/Bonv-dev/book_mgmt/commit/586c517 では、
\app\controllers\application_controller.rb 内で直接参照していますが、
後のメーラー導入時、
(リポジトリ: https://github.com/Bonv-dev/book_mgmt/commit/16545d3 )
下のように書き直しました。
\app\controllers\concerns\load_settings.rb を新規作成し、
module LoadSettings で、
@my_settings = Rails.application.config.x.settings
と書きます。
\app\controllers\application_controller.rb 内で
include LoadSettings することで、
コントローラ全体で、@my_settings が参照できます。
\app\models\application_record.rb に、
MY_SETTINGS = Rails.application.config.x.settings
と書きます。
モデル全体で、MY_SETTINGS が参照できます。
コントローラで定義した @my_settings が、そのまま使えます。
\app\views\layouts\application.html.erb に、
<script>
window.MySettings = <%= @my_settings.to_json.html_safe %>;
</script>
と書くことで、
JavaScript 全体で window.MySettings が参照できます。
上記「コントローラでの定数」の設定をしている前提です。
\app\mailers\application_mailer.rb に、
include LoadSettings することで、
メーラーのコード全体で、@my_settings が参照できます。
参考リポジトリ: https://github.com/Bonv-dev/book_mgmt/commit/16545d3