Als Anton darauf hinweist (danke Anton!), Ist mein Problem Assoziations-Caching in den Tests und es scheint, als hätte ich das Nested_Attribute in der Factory korrekt erstellt. Die korrekte Syntax ist:Wie erstellen Sie RoR Factory-Verknüpfungen mit access_nested_attributes_for?
Factory.define :job do |f|
...
f.vehicles_attributes [{:vin => "1", :model => "ford", :make => "escort"},{:vin => "1", :model => "ford", :make => "escort" }]
end
ich accepts_nested__attributes_for
in meinem Job Modell verwenden und ich versuche, nach fast ins Werk Mädchen zu wandern meine Murmeln „Befestigung Tauchen“ verlieren jedes Mal, wenn ich das Modell ändern.
gab ich eine Reihe von Code unter, aber meine Frage ist einfach:
Wie verwende ich Fabriken nested_attributes zu schaffen?
Ich kann eine Job-Instanz mit dem folgenden Code erstellen, aber ich kann in meinen Komponententests keine Create-Fahrzeuge erstellen. Ohne die f.vehicles_attributes...
fehlgeschlagen meine Job Tests Validierungen.
My Unit-Tests erzeugen die folgenden Ergebnisse:
test "factory" do
job = Factory(:job)
assert(job.valid?) # => true
assert(job.vehicles.first.valid?) # => true
vehicle = Factory(:vehicle)
assert(vehicle.job.vehicles.size == 1) # => true
assert_equal(vehicle.job.vehicles.first.vin, "2") # => FALSE. <"1"> expected but was <"2">
end
Factory.define :job do |f|
...
f.vehicles_attributes [:vin => "1", :model => "ford", :make => "escort" ]
end
Factory.define :vehicle do |f|
f.vin "2"
f.model "ford"
f.make "escort"
f.association :job
end
class Job < ActiveRecord::Base
has_many :vehicles, :dependent => :destroy
validate :job_must_have_at_least_one_vehicle
accepts_nested_attributes_for :vehicles, :allow_destroy => :true, :reject_if => proc { |vehicle_attributes| Job.insufficient_vehicle_input?(vehicle_attributes) }
def job_must_have_at_least_one_vehicle
errors.add(:vehicles, "need to be added") if self.vehicles.empty?
end
def self.insufficient_vehicle_input?(vehicle_attributes)
vehicle_property_keys = vehicle_attributes.keys
vehicle_property_keys.delete('_delete')
vehicle_property_keys.delete('is_operational')
vehicle_property_keys.delete('has_keys')
vehicle_property_keys.each do |attribute_to_validate|
if(!vehicle_attributes[attribute_to_validate].nil? && !vehicle_attributes[attribute_to_validate].empty?)
return false
end
end
return true
end
end
Btw, die korrekte Verwendung von assert_equal ist: assert_equal (erwartet, tatsächlich) –