2012-03-13 5 views
0

モデルに日付(実際にDATEタイプを持つ)を検証したいと思います。だから、私はそのsimleメソッドのために書き込みを試み、検証によって実行します。Rails 3 - 日付のタイプをチェックするためのカスタム検証

Teacher 

class Teacher < ActiveRecord::Base 
    attr_accessible :teacher_birthday # DATE type! 

    belongs_to :user 

    validates :teacher_birthday, :presence => true, 
           :unless => :date_is_correct? 

    ######## 

    def date_is_correct?  
    parsed_data = Date._parse(:teacher_birthday) 
    input_day = parsed_data[:mday] 
    input_month = parsed_data[:mon] 
    input_year = parsed_data[:year] 

    correct_days = 1..31 
    correct_months = 1..12 
    correct_year = 1900..2000 

    if (correct_days.member? input_day) and (correct_months.member? input_month) and 
     (correct_year.member? input_year) 
     true 
    else 
     errors.add(:teacher_birthday, 'date is invalid') 
     false  
    end  
    end  

私がrspecを実行すると、多くのテストが失敗します。

TypeError: can't convert Symbol into String 
# ./app/models/teacher.rb:56:in `_parse' 
# ./app/models/teacher.rb:56:in `date_is_correct?' 

私は何かが間違っていると思います。誰かが間違っていることを教えてくれますか?

+0

エラーメッセージは何ですか? – awendt

+0

'Date._parse(:teacher_birthday)'はなぜ期待されますか? –

+0

なぜですか?私をより良い方法でお勧めしてください! – ExiRe

答えて

0

これはまったく必要ではありません。 Date.parse(:teacher_birthday)が日付を返し、例外を発生させない場合、有効な日付があります。

0

Date._parseは、日付を含む文字列値を想定しており、コード内では常に 'teacher_birthday'を解析しようとします。最初にフィールドの値を取得し、値をDate._parseに渡す必要があります。 ActiveRecordはフィールドと同じ名前のメソッドを作成して値を取得します。 次のいずれかが動作します:

ショート道を

parsed_data = Date._parse(teacher_birthday) 

同じよう

parsed_data = Date._parse(self[:teacher_birthday]) 
0

parsed_data = Date._parse(self.teacher_birthday) 

self.を解析中に自動的に追加された)最初の明示的な方法に

新しい宝石が作成されました最初の場所に作成された「理由」の詳細については、とexplanatory blog postが存在します。

あなたのコードがシンプルになり、このライブラリでは

Date:teacher_birthdayに割り当てられている以外のもの

class Post < ActiveRecord::Base 
    validates_type :teacher_birthday, :date 
end 

これは、例外がスローされます。

関連する問題