如何在FactoryBot中嵌套创建对象?遇company_id未定义错误求助
解决FactoryBot嵌套创建Post和Card时的company_id未定义问题
错误原因
你在定义card属性时,直接写company_id: company_id,这里的第二个company_id是在FactoryBot的SyntaxRunner上下文里查找的局部变量/方法,而非当前正在构建的Post实例的company_id属性,所以会抛出未定义的错误。另外你的company_id属性设置为空的{},没有实际赋值,也会导致后续无法使用。
解决方案
根据实际场景,有两种常用的解决方式:
方式1:关联真实的Company对象(推荐)
如果company_id对应真实的Company模型,先创建Company工厂,让Post和Card关联同一个Company对象,这样更符合业务逻辑:
- 先定义Company工厂:
factory :company do name { Faker::Company.name } # 添加其他必要的Company属性 end
- 修改Post工厂,关联Company并让Card复用同一个Company:
factory :post do first_title { Faker::Name.name } sub_title { Faker::Name.name } email { Faker::Internet.email } company { create(:company) } # 自动创建并关联Company card { create(:card, company: company) } # 复用Post关联的Company,FactoryBot会自动处理company_id end
方式2:直接指定company_id值
如果不需要关联Company模型,仅需传入company_id数值,需确保company_id先被赋值,并通过self访问当前Post实例的属性:
factory :post do first_title { Faker::Name.name } sub_title { Faker::Name.name } email { Faker::Internet.email } company_id { Faker::Number.number(digits: 5) } # 给company_id生成具体数值 card { FactoryBot.create(:card, company_id: self.company_id) } # 用self访问当前Post的company_id end
内容的提问来源于stack exchange,提问作者what l
相关产品推荐
相关产品推荐

