如何编写FactoryGirl for has_one与autosave关联:true?

时间:2016-05-02 03:13:13

标签: ruby-on-rails factory-bot

这个问题有点长。请耐心等一下。以下是模型orderorder itemorder has_one order 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声明嵌套属性,因此在order_item控制器中为order声明了mass assignment个属性。

简化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 %>

我的问题是如何使用FactoryGril为order视图代表order

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

order_item_attribues: order_item似乎不起作用(因为没有声明嵌套属性,所以并不令人惊讶)。

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

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

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

但是接受嵌套属性到order initialize方法应该添加:

class Order < ActiveRecord::Base
   accept_nested_attributes_for :order_item
end