2009-09-03 10 views
27

レールはdatetimeの検証を行いますか?私はプラグインを見つけた http://github.com/adzap/validates_timeliness/tree/master、 しかし、それは箱から来るべきである何かのように思える。レールはdatetime検証で構築されています

+1

私は 'validates_timeliness'を愛する:私はこのような何かをやっています。それは宝石としてインストールすることができます。選択された回答をコピー&ペーストするほど速くインストールされました。 –

答えて

40

ありますノー日時のActiveRecordのバリデータを内蔵していますが、簡単にこのようなもので、プラグインを使用せずに、ActiveRecordのモデルに機能のこの種を追加することができます。

class Thing < ActiveRecord::Base 
    validate :happened_at_is_valid_datetime 

    def happened_at_is_valid_datetime 
    errors.add(:happened_at, 'must be a valid datetime') if ((DateTime.parse(happened_at) rescue ArgumentError) == ArgumentError) 
    end 
end 
+0

パーフェクト、感謝ギャベ。 – Daniel

+0

これは助けてうれしいです。最も輝かしいコードではありませんが、機能します。 –

+0

ありがとう、これは素晴らしいです。 'validates_timeliness'を試みましたが、getterとsetterを使用する際に問題がありました。これは完全に機能しました。 –

-2

それは検証するために非常に必要です日付。デフォルトのRailsフォームヘルパーでは、9月31日のような日付を選択できます。 、私はちょうど日が実際には、日付、およびでない文字列であることを検証するために探していた

class MyModel < ActiveRecord::Base 
    validate :mydate_is_date? 

    private 

    def mydate_is_date? 
    if !mydate.is_a?(Date) 
     errors.add(:mydate, 'must be a valid date') 
    end 
    end 
end 

+0

は、フォームを介してユーザー入力を検証することは良いスタートですが、質問の文脈営業担当者がRailsのモデル検証を求めていたことを示唆しています。 –

12

ゲイブの答えはので、ここで私は、日付を検証するためにやったことだ、私のために動作しませんでした文字、int型、float型、等...

より複雑な日付の検証がここで見つけることができます:https://github.com/codegram/date_validator

+1

宝石は最も簡単な解決策です、私は実装するために3分かかった。コードを記述する価値はありません。 –

+2

@MichaelSchmitz - コードを書いてみる価値はある - コードを見ている新しい人は、その宝石の存在を知らないかもしれないし、単純なタスクであるために余計なオーバーヘッドを加える。 – Toby

+0

@Toby - ポインタありがとう、あなたはそれについて正しいです。私は今のところ唯一の開発者です。 –

1

あなたは内部のappディレクトリ

2でバリと呼ばれるフォルダを作成して)自分で

1をカスタム日時バリデータを作成することができます)ファイルdatetime_validator.rbを作成します。アプリ内の以下の内容で/ディレクトリ

class DatetimeValidator < ActiveModel::EachValidator 
    def validate_each(record, attribute, value) 
    if ((DateTime.parse(value) rescue ArgumentError) == ArgumentError) 
     record.errors[attribute] << (options[:message] || "must be a valid datetime") 
    end 
    end 
end 

3をバリデータ)モデル

class YourModel < ActiveRecord::Base 
    validates :happend_at, datetime: true 
end 

4にこの検証を適用します)application.rb

config.autoload_paths += %W["#{config.root}/app/validators/"] 

5)再起動中に以下の行を追加します。あなたのレールアプリケーション

注意:上記の方法は、レール4

6

最近のバージョンのRailsは、検証前にtype castの値になるため、無効な値はカスタムバリデーターにnilとして渡されます。

# app/validators/date_time_validator.rb 
class DateTimeValidator < ActiveModel::EachValidator 
    def validate_each(record, attribute, value) 
    if record.public_send("#{attribute}_before_type_cast").present? && value.blank? 
     record.errors.add(attribute, :invalid) 
    end 
    end 
end 
# app/models/something.rb 
class Something < ActiveRecord::Base 
    validates :sold_at, date_time: true 
end 
# spec/models/something_spec.rb (using factory_girl and RSpec) 
describe Something do 
    subject { build(:something) } 

    it 'should validate that :sold_at is datetimey' do 
    is_expected.not_to allow_value(0, '0', 'lorem').for(:sold_at).with_message(:invalid) 
    is_expected.to allow_value(Time.current.iso8601).for(:sold_at) 
    end 
end 
関連する問題