2012-02-08 46 views
3

这就是情况。轨道上的红宝石,factory_girl,validates_presence_of和多态关联

宝石:导轨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 %> 

什么是定义工厂的正确方法?

# does not work 
Factory.define :house do |h| 
    h.association :address 
end 

# does not work 
Factory.define :house do |h| 
    h.after_build do |record| 
    Factory.build(:address, :addressable => record, :nested => '') 
end 
end 

# does not work 
Factory.define :house do |h| 
    h.after_build do |record| 
    Factory.create(:address, :addressable => record, :nested => '') 
    end 
end 

因此,基本上,“特技”,让accepts_nested_attributes_for:地址绕过验证和建立在同一时间都记录不factory_girl工作。目前,这个丑陋的混乱是唯一的解决方案。

home = House.new 
home.name = 'On the prairie' 
home.address_attributes = Factory.attributes_for(:address, :nested => '') 
home.save 

UPDATE 解决方案:

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

您使用的是什么版本的FactoryGirl?这是Rails3吗? – 2012-02-08 05:23:59

+0

谢谢,添加它们 – efoo 2012-02-08 05:33:28

+0

[FactoryGirl和多态关联]的可能重复(http://stackoverflow.com/questions/7747945/factorygirl-and-polymorphic-associations) – Thilo 2012-10-22 10:51:48

回答

3

你的第二个FactoryGirl尝试接近,但你需要做的与内置的地址什么的。

FactoryGirl.define do 

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

end 
+0

太棒了。我相信它需要嵌套。 – efoo 2012-02-08 05:53:33

+0

当然,您可以将您想要的地址的任何属性作为Factory.build的第二个参数传递。 – 2012-02-08 06:04:01

+0

正确,我只是想让这个特定的例子工作。 – efoo 2012-02-08 14:11:51