如何为 has_one 与自动保存关联编写 FactoryGirl:true?

How to write FactoryGirl for has_one association with autosave: true?

问题有点长。请稍等片刻。这是模型 orderorder item。 Aorderhas_oneorder item.

class Order < ActiveRecord::Base
  has_one :order_item, autosave: true, dependent: :destroy, validate: true
  validates_associated :order_item
end

class OrderItem < ActiveRecord::Base
  belongs_to :order
  #validations
end

由于没有为 order_item 声明嵌套属性,因此没有在 mass assignmentorder 控制器中声明 order_item 的属性。

简化的order视图

<%=simple_form_for @order do |f| %>
  <%=f.input :order_date %>
  <%=render :inline 'order_item', locals: {f: f} %>
<% end %>

局部视图_order_items.html.erb

<%=simple_fields_for :order_item do |f| %>
  <%=f.input :prod_name %>
<% end %>

我的问题是,对于上面的 order 视图,如何用 FactoryGril 表示 order

  order_item = FactoryGirl.build(:order_item)
  order = FactoryGirl.attributes_for(:order, order_item: order_item(??))

order_item_attribues: order_item 似乎不起作用(这并不奇怪,因为没有声明嵌套属性)。

您应该能够将 order_item 对象直接传递到 attributes_for:

order_item = FactoryGirl.build(:order_item)
order = FactoryGirl.attributes_for(:order, order_item: order_item)

我认为你应该在测试中有类似的东西:

order_item_attrs = FactoryGirl.build(:order_item)
order_attrs = FactoryGirl.attributes_for(:order, order_item_attributes: order_item_attrs)

但要接受订单初始化方法的嵌套属性,应添加:

class Order < ActiveRecord::Base
   accept_nested_attributes_for :order_item
end