0

我正在尝试编写一个日期验证器。我遇到的问题是我的验证器将 date_of_birth 视为 Date 对象,但它被设置为字符串。(1) 为什么在应用验证之前将其视为日期而不是字符串,以及 (2) 我应该怎么做才能将其读取为字符串而不是日期。我遇到的问题是我想接受%m/%d/%Y日期,但是当我输入 2010 年 7 月 5 日时,我将其转换为日期,其中将 05 视为月份,将 07 视为日期。我正在使用 Devise,所以我不确定它是否对控制器中的日期有任何影响,我对此表示怀疑。

class User < ActiveRecord::Base
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable

  # Setup accessible (or protected) attributes for your model
  attr_accessible :email, :first_name, :last_name, :password, :password_confirmation, :remember_me, :address, :date_of_birth, as: [:default, :admin]
  attr_accessible :active, :role, as: [ :admin ]

  validates_presence_of :email, :first_name, :last_name, :address
  validate :valid_date_of_birth

  def date_of_birth=(date_of_birth)
    Rails.logger.info("set date_of_birth: #{date_of_birth}")
    Rails.logger.info("set date_of_birth class: #{date_of_birth.class}")
    self[:date_of_birth] = date_of_birth
  end

  private
  def valid_date_of_birth
    Rails.logger.info "the date of birth: #{date_of_birth}"
    Rails.logger.info "the date of birth class: #{date_of_birth.class}"
    errors.add(:date_of_birth, 'must be a valid datetime') if ((DateTime.strptime(date_of_birth, "%m/%d/%Y") rescue ArgumentError) == ArgumentError)
  end
end

所以,设置 date_of_birth,我得到 String。 valid_date_of_birth将其视为 Date,即 date_of_birth 的 DB 类型。我在这里做错了什么使这变得过于复杂吗?我唯一的选择是维护一个额外的字符串字段吗?这如何与编辑一起工作?

4

1 回答 1

1

如果您的date_of_birth属性是从参数/表单中设置的 - 那么它会以String的形式出现。问题出现在它被设置为对象的地方——它被转换为数据库中对象的数据类型。

因此,在您的users_controller中的create操作中: params[:user][:date_of_birth]以字符串形式出现

但是,只要将其设置为用户对象: @user.date_of_birth = params[:user][:date_of_birth] ## 它就会转换为数据库中的类型(日期类型)。

解决方案: 1)在分配之前验证控制器中的date_of_birth。2)在分配给用户对象之前,为 date_of_birth_input 定义一个 attr_accessor 并在模型中进行验证,就像您目前正在做的那样。

于 2012-07-10T19:16:29.957 回答