Ruby on rails ruby on rails,factory_girl,验证是否存在和多态关联

Ruby on rails ruby on rails,factory_girl,验证是否存在和多态关联,ruby-on-rails,ruby,factory-bot,Ruby On Rails,Ruby,Factory Bot,情况是这样的 宝石:rails 3.2,factory_girl 2.5.1 class House has_one :address, :as => :addressable validates :address, :presence => true accepts_nested_attributes_for :address end class Address attr_accessor :nested belongs_to :addressable, :p

情况是这样的

宝石:rails 3.2,factory_girl 2.5.1

class House
  has_one :address, :as => :addressable
  validates :address, :presence => true
  accepts_nested_attributes_for :address
end

class Address
  attr_accessor :nested
  belongs_to :addressable, :polymorhic => true
  validates :addressable, :presence => true, :unless => :nested
end
这是怎么回事

<%= form_for @house do |f| %>
  <%= f.label :name %>
  <%= f.text_field :name %>
  <%= f.fields_for :address do |a| %>
    <%= a.hidden_field :nested %>
    <%= a.label :street_address %>
    <%= a.text_field :street_address %>
因此,基本上,允许accepts\u嵌套的\u attributes\u for:address绕过验证并同时创建两个记录的“技巧”在factory\u中不起作用。目前,这种丑陋的混乱局面是唯一的解决办法

home = House.new
home.name = 'On the prairie'
home.address_attributes = Factory.attributes_for(:address, :nested => '')
home.save
更新 解决方案:

Factory.define :house do |h|
  h.after_build do |record|
    record.address = Factory.build(:address, :addressable => record)
  end
end

您的第二次FactoryGirl尝试已接近尾声,但您需要对构建的地址进行一些操作

FactoryGirl.define do

  factory :house do
    after_build do |house|
      house.address = Factory.build(:address)
    end
  end

end

你用的是什么版本的FactoryGirl?这是Rails3吗?可能是真棒的复制品。当然,您可以将希望地址具有的任何属性作为第二个参数传递给Factory.build。
FactoryGirl.define do

  factory :house do
    after_build do |house|
      house.address = Factory.build(:address)
    end
  end

end