Rails 5におけるbelongs_toの挙動について

背景

昨年2016年にRails 5がリリースされました。様々な新機能や修正が加えられ、より一層強力なフレームワークになったといえるでしょう。Rails 5について詳細を知りたい場合はRuby on Rails 5.0 Release Notesが参考になるかと思います。

belongs_toの挙動について

Release Notesにおける下記の記述の通り、belongs_toの挙動について変更があります。

belongs_to will now trigger a validation error by default if the association is not present. You can turn this off on a per-association basis with optional: true. Also deprecate required option in favor of optional for belongs_to. (Pull Request)

シンプルに言うと、belongs_toはそれによって紐づくモデルオブジェクトが存在しない場合はバリデーションエラーとなるように変更されました。

不具合&対応

この変更により、Rails 4で正常に動作していたアプリケーションがバリデーションエラーに引っかかる恐れがあります。Rails 4以前と同じように動作してほしい、という場合は下記の2つの対応が考えられるのではないでしょうか。

オプションを付与

belongs_toのオプションにoptional: trueを付与すると関連付けが任意となり、バリデーションエラーが発生しなくなります。

class Product < ActiveRecord::Base
  belongs_to :user, optional: true
end

initializerを変更

設定でこの挙動をRails 4以前の挙動に戻すことが可能です。config/initializers/new_framework_defaults.rbというファイル(存在しない場合は作成してください)に下記の設定を追加するだけです。

Rails.application.config.active_record.belongs_to_required_by_default = false

シェアする

  • このエントリーをはてなブックマークに追加

フォローする