2016-11-07 9 views
0

私は現在、devise gemを使ってレール上でRubyをプログラミングしています。私のユーザーに誕生日を追加しました。私は18歳以上のユーザーを検証しようとしています。私はこれを試しましたが、動作していません。18歳以上の生年月日属性を検証したい

class User < ActiveRecord::Base 
    # Include default devise modules. Others available are: 
    # :confirmable, :lockable, :timeoutable and :omniauthable 
    def is_older?() 
     (DateTime.now - :birth_date).to_i >= 6570 

    end 
    validates :birth_date, :presence =>{:if => {:is_older? =>{:message => 'You should be over 18 years old.'}}} 



    devise :database_authenticatable, :registerable, 
     :recoverable, :rememberable, :trackable, :validatable 

end 

存在するかどうかわかりませんが、存在する必要がありますが、エラーが表示されないように追加しました。基本的には、ifステートメントをバリデーターとして使用しようとしています。可能であれば、ユーザーが登録しようとした生年月日と今日の日付の差が18年を超えているかどうかを確認します。 ありがとう!あなたが個別に存在し、年齢を確認する必要があり、あなたがより良い日付構文(例えば、18.years.ago)のためActiveSupport::Durationを使用することができます

答えて

2

class User < ActiveRecord::Base 
    # Include default devise modules. Others available are: 
    # :confirmable, :lockable, :timeoutable and :omniauthable 
    devise :database_authenticatable, :registerable, 
     :recoverable, :rememberable, :trackable, :validatable 

    validates :birth_date, :presence => true 
    validate :validate_age 

    private 

    def validate_age 
     if birth_date.present? && birth_date > 18.years.ago.to_d 
      errors.add(:birth_date, 'You should be over 18 years old.') 
     end 
    end 
end 
+0

は「.to_i」に「.to_d」を変更し、追加した後にうまく働きましたbirth_dateと同じ行。 if文は次のようになります。 if birth_date.present? && birth_date.to_i> 18.years.ago.to_i ありがとうございました! –

+1

ええと、私は整数にキャストする必要性が不思議です。私は 'birth_date.class.name'と' 18.years.ago.class.name'を見てどちらかが日付にキャストされる必要があるかどうかを見ます。いずれにせよ、あなたはそれを働かせることができてうれしいです! –

+0

私はあなたが正しいと思うし、整数へのキャストはまったく必要ない。たぶん私はキャストが必要な6570(18歳の日数)と日付を比較しようとしているのかもしれません。しかし、あなたのコメントは完全に有効であり、より簡単な解決策を提供します。 ご協力ありがとうございます@ChrisPeters –

関連する問題