Railsを5.0.0から5.2.3に変更した

Railsを5.0.0から5.2.3に変更した

Table of Contents

個人アプリのRailsバージョンが結構古いことに気づいたので、バージョンを上げたときに躓いたポイントをまとめた記事です。

Gemfileのrailsを5.0.0 から 5.2.3 に変更後、bundle update railsを実行

gemインストールは成功したが末尾にメッセージが表示。

原文

HEADS UP! i18n 1.1 changed fallbacks to exclude default locale.
But that may break your application.

Please check your Rails app for 'config.i18n.fallbacks = true'.
If you're using I18n (>= 1.1.0) and Rails (< 5.2.2), this should be
'config.i18n.fallbacks = [I18n.default_locale]'.
If not, fallbacks will be broken in your app by I18n 1.1.x.

For more info see:
https://github.com/svenfuchs/i18n/releases/tag/v1.1.0

i18n の 1.1 では、デフォルトロケールが除外されました。

config.i18n.fallbacks = true

を確認して i18n が >= 1.1.0 および Rails < 5.2.2 の場合はこれを

config.i18n.fallbacks = [I18n.default_locale]

に変更すべきです。

そうしないとこれのせいでアプリが異常動作します。

親が保存されないと子はcreateを呼び出せない

ActiveRecordでは、親子関係のあるモデルで親より先に子を保存しようとするとエラーになるようになりました。

原文

ActiveRecord::RecordNotSaved:
You cannot call create unless the parent is saved

説明

例えば 著者(Author) と 記事(Article) なら関連は次のようになります。

class Author < ApplicationRecord
  has_many :articles
  # カラムとして name: string がある
end

class Article < ApplicationRecord
  belongs_to :author
  # カラムとして title: string がある
end

このとき Author を保存せずにArticleを保存しようとするとエラーになります。

author = Author.create(name: '')
author.name = 'hoge'
author.articles.create!(title: 'ほげ') # エラー
author.save!

対応策

子を保存しないか先に親を保存させる必要があります。

author = Author.create(name: '')
author.name = 'hoge'
author.articles.build(title: 'ほげ')
author.save!
このエントリーをはてなブックマークに追加