2

私はこれに数日間苦労しています。私はこのモデルを持っています:

class BusinessEntity < ActiveRecord::Base

  has_many :business_locations
  accepts_nested_attributes_for :business_locations, :allow_destroy => true,
        :reject_if => proc { |attributes| attributes.all? { |key, value| key == '_destroy' || value.blank? } }

 after_initialize :build_child

  ....

  def build_child
    self.business_locations.build if self.business_locations.empty?    
  end

business_entites.rb(工場)

FactoryGirl.define do
  factory :business_entity do
    name "DaveHahnDev"
    association :company, :factory => :company
    association :default_currency, :factory => :currency

    factory :business_entity_with_locations do
      after(:build) do |business_entity|
        business_entity.class.skip_callback(:create, :after, :set_primary_business_info)
        business_entity.business_locations << FactoryGirl.build(:business_location)
      end
    end
  end

  factory :business_location do
    name "Main Office"
    business_entity
    address1 "139 fittons road west"
    address2 "a different address"
    city { Faker::Address.city }
    province "Ontario"
    country "Canada"
    postal_code "L3V3V3"

  end
end

スペックを呼び出すFactoryGirl.create(:business_entity)と、business_locationsの属性が空白であるという評価エラーが発生します。これは、after_initializeコールバックによって初期化された子です。ブラウザからアプリケーションを使用する場合と同様に、reject_ifがこれを処理すると思いました。追加した場合:

  before_validation :remove_blank_children

  def remove_blank_children
    self.business_locations.each do |bl|
        bl.mark_for_destruction if bl.attributes.all? {|k,v| v.blank?}
    end
  end

すべてがうまくいくでしょうが、私はこれをする必要はないように感じます。

これを間違ってテストしている可能性はありますか、それともモデルに子を作成するのは悪い習慣ですか。

どんな考えでも大きな助けになります。

4

1 に答える 1

1

モデルに子を作成するのは悪い習慣ですか

必ずしもそうとは限りませんが、避けたいと思いafter_initializeます。モデルのすべてのインスタンス化で実行されますfind

business_locationを追加する必要がある場合を切り分けて、明示的に行う方がよいと思います。そして、あなたのbusiness_entity_with_locationsファクトリがまさにそれを行っているように見えるので、なぜあなたがコールバックを必要とするのか私にはわかりません。

なぜ動かaccepts_nested_attributes_forないのかというと、使っていないからだと思います。次のような属性ハッシュが必要です。

{:business_locations => {0 => {:name=>"サンプル名}}}

のようなメソッドに渡されnewます。buildそれはあなたがしていることではありません—あなたはパラメータなしでアソシエーションを呼び出しています。したがって、によって提供される属性セッターロジックがaccepts_nested_attributes_for呼び出されることはありません。

于 2012-11-15T03:39:13.947 に答える