gpt4 book ai didi

ruby-on-rails - ruby on rails、factory_girl、validates_presence_of 和多态关联

转载 作者:数据小太阳 更新时间:2023-10-29 08:01:22 26 4
gpt4 key购买 nike

情况是这样的。

Gems: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 %>

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

# 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 :address 绕过验证并同时创建两条记录的“技巧”在 factory_girl 中不起作用。目前,这个丑陋的烂摊子是唯一的解决方案。

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

关于ruby-on-rails - ruby on rails、factory_girl、validates_presence_of 和多态关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9188158/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com