0

Rails 4/Mongoid を使用して、MyClass次のように定義された検証で呼び出されるモデルがあります。

class MyClass
  include Mongoid::Document

  ...some attributes...

  before_validation :prevalidate

  def prevalidate
    self.required_prop = false if self.required_prop_two
  end
  validate do |instance|
    puts 'VALIDATING'
    ...some more validation...
  end
end

次に、2 つの Rspec テストがあり、そのうちの 1 つだけが「VALIDATING」と出力されます。

# This test fails, and does not print 'VALIDATING'
it 'is an invalid instance' do
  instance = Fabricate.build(:my_class)
  instance.required_prop = nil
  instance.required_prop_two = nil
  instance.should have(1).errors_on(:required_props)
end
# This test passes, and prints 'VALIDATING'
it 'is a valid instance' do
  instance = Fabricate.build(:my_class)
  instance.other_required_prop = nil
  instance.should have(1).errors_on(:other_required_prop)
end

私は、validateこれらのエラーをチェックするときに常に実行する必要があると想定しています。ただし、テスト #2 でのみ実行され、テスト #1 では実行されません。これをスキップする方法については完全に困惑しています。2番目のプロパティがコメントアウトされている場合、テスト#1が実行されるため、その2番目のプロパティの設定に関連しているようvalidateです。

私の例がまばらであることは知っていますが、このようなことがどのように起こるかについて誰か提案がありますか?

4

1 に答える 1

0

before_validation申し訳ありませんが、句の使用法で自分自身を撃ったことが判明しました。最後に評価された行でprevalidatefalse が返されたため、検証が中止されました。

def prevalidate
  self.required_prop = false if self.some_other_prop
  return true # Otherwise, it'll stop validation
end

最後の評価を返すという Ruby のやり方に、このようなことで頭が痛くなることがあります。

于 2013-09-17T03:31:25.787 に答える