2011-11-26 12 views
22

場合、私は単純なモデル例外ArgumentError:あなたは、少なくとも1つの検証を提供する必要があります。

class Task < ActiveRecord::Base 
    validates :deadline, :if => :deadline_in_future? 

    def deadline_in_future? 
    Date.today < self.deadline 
    end 
end 

すべてがOKようだが、ときに私私のレールコンソールで

irb(main):001:0> Task.new 
ArgumentError: You need to supply at least one validation 

どこに問題があるを持っています?

答えて

35

:deadlineを確認する方法をvalidatesに伝えるのを忘れました。私はあなたが誤解していると思います:ifは何をしますか? :if => :deadline_in_future?オプションは意味:

Validate :deadline only if the deadline_in_future? method returns a true value.

私はあなたが期限が将来的にあることを検証したいと思われる:

validate :deadline_in_future? 

詳細はActive Record Validations and Callbacks Guideでご利用いただけます。

+0

はい、本当に。私はバリデーションについて誤解しました。ありがとうございました。 – Ximik

1

validatesメソッドに検証を渡さないと言います。例えば、validates :presenceのようになります。あなたは何を検証しようとしていますか?

+0

私はこのような検証をしようとしています。http://guides.rubyonrails.org/active_record_validations_callbacks.html#using-a-symbol-with-if-and-unless – Ximik

+2

この例では、:presence => true 'は' card_number'フィールドの存在が検証されるべきだと言っていますが、 'paid_with_card?'メソッドが真を返す場合にのみ検証を実行するべきです。その背後にあるアイデアは、支払いがクレジットカードで行われた場合、注文にはクレジット番号が必要ですが、クレジットカードで支払いが行われなかった場合、そのカード番号が適切に保管されていることを確認する必要はありません。 –

77

validatesvalidateに変更する必要があります。

+5

ありがとう、なぜですか? – yeyo

+2

@yeyoこれはカスタム検証の構文です。 [Active Record Validations Docのカスタムメソッド](http://guides.rubyonrails.org/active_record_validations.html#custom-methods)を参照してください。 –

関連する問題