パパエンジニアのアウトプット帳

30歳に突入した1児のパパエンジニアのブログ

【訂正】Rails5.1のconfig.load_defaultsを利用しているとconfig/initializers/new_framework_defaults.rbの値は上書きされない(activerecord-session_store利用時)

訂正しました (2017/10/18)

どうやら、上書きされないのではなくて、下記の現象が起きていたようです。

[Rails]... | 日々雑記


まだどれが影響を与えているのかわかってないですが、他のRailsアプリだとちゃんと上書きされていました。。。

このアプリだけなにやってもActiveRecord::Base.belongs_to_required_by_defaultがnilになっていました。

> ActiveRecord::Base.belongs_to_required_by_default
=> nil
> Rails.application.config.active_record.belongs_to_required_by_default
=> false

さらに追記

どうやらactiverecord-session-storeが原因みたい。

activerecord-session-storeを利用していると、config.load_defaults 5.1ありでconfig/initializers/new_framework_defaults.rbにRails.application.config.active_record.belongs_to_required_by_default=falseを指定した場合は上書きされない。

> ActiveRecord::Base.belongs_to_required_by_default
=> true
> Rails.application.config.active_record.belongs_to_required_by_default
=> false

config/application.rbにconfig.active_record.belongs_to_required_by_default=falseを書いた場合はちゃんと両方falseになる。 (initializersはgemの読み込み後に実行されるらしい

[config/application.rb]

module アプリ名
  class Application < Rails::Application
    # Initialize configuration defaults for originally generated Rails version.
    config.load_defaults 5.1
    config.active_record.belongs_to_required_by_default = false # ここに直接書くとちゃんと上書きされる

rails c
> ActiveRecord::Base.belongs_to_required_by_default
=> false
> Rails.application.config.active_record.belongs_to_required_by_default
=> false

activerecord-session_storeのバージョン

GIT
  remote: https://github.com/rails/activerecord-session_store.git
  revision: b5e7da210c937c0aa580b8094b64019cef20e95a



ちょっとはまったのでメモ。


[config/application.rb]

module アプリ名
  class Application < Rails::Application
    # Initialize configuration defaults for originally generated Rails version.
    config.load_defaults 5.1

のように、config.load_defaults 5.1を記述すると

config/initializers/new_framework_defaults.rbにbelongs_to_required_by_defaultなどの設定を変更する記載があっても上書きはされない。

[config/initializers/new_framework_defaults.rb]

# Require `belongs_to` associations by default. Previous versions had false.
Rails.application.config.active_record.belongs_to_required_by_default = false

config/application.rbの後にconfig/initializers/new_framework_defaults.rbも読まれているので上書きされるのかと思っていたけど違うみたい。


下記にある通り、Railsが推奨する設定を使う場合にconfig.load_defaultsを利用するので上書きできなくてもいいんだと思うけど。

Rails 5.1で追加されたconfigまとめ | 日々雑記