Rails 5.0.0.1
にて以下のようにしたところ同じエラーメッセージが出ました。
条件としてはLineクラスが存在しないかつ必須であることです。
Ruby
1class User < ActiveRecord::Base
2 belongs_to :line, required: true
3end
has_manyなど他の関連の場合はわかりません。
テーブル名が予約語になるかどうかは関係ありません。エラーメッセージの通りLineは存在してなければダメ!です。
関連するクラスが存在しないかつ必須である場合にcreate()などを実行するとRails5ではValidation failed: クラス名 must exist
というエラーメッセージを出力するようです(なおRails4ではActiveRecord::RecordInvalid: Validation failed: Line can't be blank
となるため再現せずに手こずりました)。
Lineクラスを本当に作成していますか?
追記
もうちょっといろいろいじってみましたが、「クラスが存在しないかつ必須」ではなく**「エンティティが存在しないかつ必須」**が正解ですね。belongs_toで自分が属する親がいない状態ってことです。
つまりFactoryGirlで適切に行う場合は、あらかじめ関連先のエンティティをcreateで作っておいたり、質問者様のようにassociation
を指定したりで回避できます。私の環境ではassociation指定でFactoryGirlが関連先のエンティティを適切にDBに挿入してくれましたので再現しませんでした。
あまりbelongs_toが必須でなくてもいいというケースはないかと思いますが、belongs_toのオプションとしてoptional: true
を指定すればValidation failedは回避できます。
なおRails5からはbelongs_toの必須か否かがconfig/以下のファイル内にてconfig.active_record.belongs_to_required_by_default = true
と設定されているため、初期値が「必須」となります。よってoptional: true
と指定するようです。
いずれにしろ予約語であるか否かにかかわらず、適切に構成すれば問題なく実行できるはずですが…。