我想验证出生日期属性是否已年满 18 岁

Mac*_*nti 1 ruby-on-rails devise

我目前正在使用 devise gem 在 ruby​​ on Rails 上进行编程。为我的用户添加了出生日期,我正在尝试验证该用户是否已年满 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
Run Code Online (Sandbox Code Playgroud)

我不知道 :presence 是否应该在那里,但我添加了它,这样它就不会显示任何错误。基本上,如果可能的话,我尝试使用 if 语句作为验证器,这将检查用户尝试注册的出生日期与今天的日期之间的差异是否高于 18 年。多谢!

Chr*_*ers 7

您应该分别验证存在和年龄,并且可以使用ActiveSupport::Duration更好的日期语法(例如,18.years.ago):

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
Run Code Online (Sandbox Code Playgroud)

  • 将“.to_d”更改为“.to_i”并将同一行添加到birth_date后工作正常。所以 if 语句是: ifbirth_date.present? &amp;&amp;birth_date.to_i &gt; 18.years.ago.to_i 非常感谢! (2认同)