1

「誕生日」というフィールドが空白ではないこと、および日付が Chronic gem が解析できる有効な日付形式であることを検証しようとしているフォームがあります。「誕生日が無効です」というエラー メッセージが常に表示されます。シンプルなフォーマット「10/10/2010」を試してみました。

誕生日フィールドが慢性的に解析できる形式であることを確認するにはどうすればよいですか?

User.rb モデル

class User < ActiveRecord::Base

  validates :birthday, :presence => true
  validate :birthday_is_date
  validate :position, :presence => true

  # validate the birthday format
  def birthday_is_date
    errors.add(:birthday ,Chronic.parse(birthday)) # testing to see the value of :birthday
    errors.add(:birthday, "is invalid test message") if ((Chronic.parse(:birthday) rescue ArgumentError) == ArgumentError)
  end
end

contact_controller.rb

# POST /contacts/1/edit
    # actually updates the users data
    def update_user
        @userProfile = User.find(params[:id])

        respond_to do |format|
            if @userProfile.update_attributes(params[:user])
                format.html {
                    flash[:success] = "Information updated successfully"
                    redirect_to(profile_path)
                }
            else 
                format.html {
                    flash[:error] = resource.errors.full_messages

                    render :edit
                }
            end
        end
    end
4

3 に答える 3

2

検証birthday_is_dateでは、常に最初の行にエラーが追加されます。次のように記述します。

def birthday_is_date
  errors.add(:birthday, "is invalid") unless Chronic.parse(birthday)
end
于 2012-11-07T06:26:55.203 に答える
1

これを試して

validates_date_timeジェムをインストールする

日付の検証に合格できます。for example

class Person < ActiveRecord::Base
    validates_date     :date_of_birth
    validates_time     :time_of_birth
    validates_date_time :date_and_time_of_birth
  end
  

:allow_nil を使用して、値を空白にすることができます。

  class Person < ActiveRecord::Base
    validates_date :date_of_birth, :allow_nil => true
  end

ソース: https://github.com/smtlaissezfaire/validates_date_time

于 2012-11-07T06:27:51.003 に答える
1

chronic.rubyforge.orgから:

Chronic は、Ruby のビルトイン Time クラスをすべての時間の保存と計算に使用します。このため、Time クラスが処理できる時間だけが適切に解析されます。この範囲外の時間を解析すると、単純に nil が返されます。将来のリリースでは、より広い範囲の時間のサポートが計画されています。

ローカル タイム ゾーン以外のタイム ゾーンは現在サポートされていません。他のタイム ゾーンのサポートは、将来のリリースで計画されています。

Date オブジェクトを使用した Ruby の Date 検証から:

単純な検証関数

有効な日付をテストする 1 つの方法は、Date オブジェクトを作成することです。オブジェクトが作成された場合、日付は有効であり、作成されていない場合、日付は無効です。年、月、日を受け取り、日付が有効な場合は true を返し、日付が無効な場合は false を返す関数を次に示します。

def test_date(yyyy, mm, dd)
   begin
     @mydate = Date.new(yyyy, mm, dd)
     return true
   rescue ArgumentError
     return false
   end
 end

How do I validate a date in rails? の受け入れられた回答から :

プラグイン ソリューションを探している場合は、validates_timeliness プラグインをチェックアウトします。次のように機能します(githubページから):

class Person < ActiveRecord::Base
  validates_date :date_of_birth, :on_or_before => lambda { Date.current }
  # or
  validates :date_of_birth, :timeliness => {:on_or_before => lambda { Date.current }, :type => :date}
end 

利用可能な検証方法のリストは次のとおりです。

validates_date - 値を日付として
検証する validates_time - 値を時間のみとして検証する、つまり '12:20pm'
validates_datetime - 完全な日時として値を検証する
validates - :timeliness キーを使用し、ハッシュにタイプを設定します。

于 2012-11-07T06:36:41.087 に答える