User:Hotel = 1:多
Hotelインスタンスは生成時にUserのIDがないと作成できません。
そのため、user_idを直接書き込んで登録しようとしましたが、エラーになりました。
上手くいかない原因は、紐付く親が存在していないからではないかと以下の記事のコメント欄には書いてありました。
rspecでエラーが出ます
誤った書き方
# spec/factories/hotels.rb
FactoryBot.define do
factory :hotel do
user_id {1}
name {"ホテル名"}
address1 {"東京都"}
address2 {"千代田区XXX町X-X-X"}
end
end
# spec/models/hotel_spec.rb
require 'rails_helper'
RSpec.describe Hotel, type: :model do
describe "ホテル" do
context "保存" do
it "正しく登録" do
hotel = FactoryBot.build(:hotel)
expect(hotel).to be_valid
end
end
end
end
解決方法
user_idを登録する際に、Userモデルを作成した際のFactoryBotを活用
# spec/factories/users.rb
FactoryBot.define do
factory :user_bob, class: "User" do
name {"bob"}
email {"bob@sample.com"}
password {"sample"}
password_confirmation {"sample"}
end
end
解決1
user_idの登録時に、userインスタンスの作成
# spec/factories/hotels.rb
FactoryBot.define do
factory :hotel do
user_id { FactoryBot.create(:user_bob).id }
name {"ホテル名"}
address1 {"東京都"}
address2 {"千代田区XXX町X-X-X"}
end
解決2
associationを使用する。
# spec/factories/hotels.rb
FactoryBot.define do
factory :hotel do
# factory名はmodel名と同一の場合、省略可
association :user, factory: :user_bob
name {"ホテル名"}
address1 {"東京都"}
address2 {"千代田区XXX町X-X-X"}
end