1

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 による投稿を参照)。レールによるこの仮定は、自動的に検証に入れられ、値の割り当てを許可しません(デフォルトではアソシエーションからのものでなければなりません)。この仮定は、アプリで問題を引き起こし ( を割り当てることはできません)、名前を変更して、この関連性を断ち切ります。resourceassociationresource_idresourceresource_idresource_idresource_idresource

4

2 に答える 2

1

ここでの問題は、関連付けの存在を検証しているためです。その必要はまったくありません。ラインから削除resourceしますvalidates_presence_of

アプリケーションで、リソースなしでログ エントリを作成できる実際のケースはありますか? そうでない場合は、これらの属性の検証についてあまり気にしません。null であることを非常に心配している場合は、データベース制約を設定するのが適切な方法です。resource_idresource_id

于 2013-08-11T21:38:18.147 に答える
0

resourceはルーティングに使用される rails キーワードですが、それが原因で問題が発生する可能性がありますか?

于 2013-08-11T21:25:08.803 に答える