FactoryGirl の奇妙な動作に遭遇しました。commonx_log の定義は次のとおりです。
FactoryGirl.define do
factory :commonx_log, :class => 'Commonx::Log' do
log "My log"
resource_id 1
resource "MyString"
last_updated_by_id 1
end
end
log
モデルでの検証は次のとおりです。
validates_presence_of :log, :resource, :resource_id
次の rspec はパスします:
it "should be OK" do
c = FactoryGirl.build(:commonx_log, :last_updated_by_id => 2)
c.should be_valid
end
resource
ただし、値をandに代入しようとするとすぐにresource_id
:
c = FactoryGirl.build(:commonx_log, :resource => 'resource')
エラーがあります:
1) Commonx::Log should be OK
←[31mFailure/Error:←[0m ←[31mc.should be_valid←[0m
←[31mexpected #<Commonx::Log id: nil, log: "My log", resource_id: nil, resource: "resource", last_updated_by_id: 1, created_at: nil, updated_at: nil> to be valid
, but got errors: Resource can't be blank←[0m
エラーの原因は何ですか? ファクトリーガールでresource
のキーワークですか?助けてくれてありがとう。
アップデート:
私たちが持っている解決策は、ログモデルで名前を変更resource
することです。resource_name
その後、resource_name
通常のフィールドとして扱い、検証を行うことができます。resource_id
ログ モデルにとが表示される場合、Rails はそれが特定のタイプである resource
と想定します(以下の Ryan Bigg による投稿を参照)。レールによるこの仮定は、自動的に検証に入れられ、値の割り当てを許可しません(デフォルトではアソシエーションからのものでなければなりません)。この仮定は、アプリで問題を引き起こし ( を割り当てることはできません)、名前を変更して、この関連性を断ち切ります。resource
association
resource_id
resource
resource_id
resource_id
resource_id
resource