binari costruiti in validazione datetime

Le guide eseguono qualsiasi convalida per datetime? Ho trovato un plugin http://github.com/adzap/validates_timeliness/tree/master , ma sembra qualcosa che dovrebbe venire fuori dalla scatola.

Non esiste un validatore ActiveRecord integrato per DateTimes, ma è ansible aggiungere facilmente questo tipo di funzionalità a un modello ActiveRecord, senza utilizzare un plug-in, con qualcosa di simile a questo:

 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 

La risposta di Gabe non ha funzionato per me, quindi ecco cosa ho fatto per convalidare le mie date:

 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 

Stavo solo cercando di verificare che la data sia effettivamente una data, e non una stringa, un carattere, int, float, ecc ...

È ansible trovare una convalida più complessa della data qui: https://github.com/codegram/date_validator

Le versioni recenti di Rails digiteranno i valori cast prima della convalida, quindi i valori non validi verranno passati come nil ai validatori personalizzati. Sto facendo qualcosa di simile a questo:

 # 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 

È ansible creare un validatore datetime personalizzato autonomamente

1) creare una cartella denominata validatori nella directory dell’app

2) creare un file datetime_validator.rb. con il seguente contenuto all’interno della directory app / validators

  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) Applicare questa convalida sul modello

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

4) Aggiungi la riga sottostante in application.rb

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

5) Riavvia l'applicazione delle tue guide

Nota: il metodo sopra testato nelle guide 4

Raccomando un gem date_validator . Vedi https://rubygems.org/gems/date_validator . È ben gestito e la sua API è semplice e compatta.

È abbastanza necessario convalidare le date. Con gli helper del modulo Rails predefinito è ansible selezionare date come il 31 settembre.