ruby on rails, factory_girl, validates_presence_of и полиморфные ассоциации - PullRequest
3 голосов
/ 08 февраля 2012

Вот ситуация.

Драгоценные камни: рельсы 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

Так что, по сути, «хитрость», которая позволяет acceptpts_nested_attributes_for: address обойти проверки и создать обе записи одновременно, не работает в 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

1 Ответ

3 голосов
/ 08 февраля 2012

Ваша вторая попытка FactoryGirl близка, но вам нужно что-то сделать с этим встроенным адресом.

FactoryGirl.define do

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

end
...