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_of_birthのDBタイプであるDateと見なされます。私はここでこれを過度に複雑にしている何か間違ったことをしていますか?追加の文字列フィールドを維持する唯一のオプションはありますか?これは編集でどのように機能しますか?

4

1 に答える 1

1

date_of_birth属性がパラメーター/フォームから設定されている場合、それは String として入ってきます。問題は、オブジェクトに設定されるとすぐに発生します-データベース内のデータ型に変換されます。

したがって、 createアクション のusers_controllerでは、params[:user][:date_of_birth]が文字列として入力されます。

しかし、User オブジェクトに設定するとすぐに: @user.date_of_birth = params[:user][:date_of_birth] ## データベースの型 (Date 型) に変換されます。

解決策: 1) 割り当てる前にコントローラーで date_of_birth を検証します。2) date_of_birth_input の attr_accessor を定義し、User オブジェクトに割り当てる前に、現在行っているようにモデルで検証します。

于 2012-07-10T19:16:29.957 に答える