Validieren ob Datum in der Zukunft liegt

Hallo,

ich möchte eine Validierung durchführen, ob ein vom User eingegebenes
Datum nicht kleiner als das von morgen ist. Das heipt wenn heute der
5.2.2009 ist, dann muss der user mindestens 06.2.2009 eingeben.

Habe schon mit validates_numericality_of und greater than rumgehampelt,
komme aber auf keinen grünen Zweig.

Hat jemand einen Rat? Ist wahrscheinlich so einfach, dass ich deswegen
nichts finde.

Gruß

Adam

On Thu, 5 Feb 2009 21:11:38 +0100
Adam M. [email protected] wrote:

nichts finde.
bspw. so:

class Event < ActiveRecord::Base
attr_accessor :start_date

def validate_on_create
if @start_date == nil || @start_date <= Date.today
errors.add(:start_date, “muss in der zukunft liegen.”)
end
end

end

oder du erweiterst Validation um sowas wie validates_date_greater_than

gruesse
rene

Rene P. wrote:

On Thu, 5 Feb 2009 21:11:38 +0100
Adam M. [email protected] wrote:

nichts finde.
bspw. so:

class Event < ActiveRecord::Base
attr_accessor :start_date

def validate_on_create
if @start_date == nil || @start_date <= Date.today
errors.add(:start_date, “muss in der zukunft liegen.”)
end
end

end

oder du erweiterst Validation um sowas wie validates_date_greater_than

gruesse
rene

Hi Rene

Also ich habe jetzt folgenden code in meinem Order model in dem
deliverdate das besagte datum enthält

class Order < ActiveRecord::Base
belongs_to :user
has_many :products
belongs_to :raddress

def validate_on_create
if deliverdate <= Date.today
errors.add(:deliverdate, “Datum muss in der Zukunft liegen.”)
end
end
end

Das Problem ist aber, dass ich immer noch frühere Dati speichern kann.

On Thu, 5 Feb 2009 22:34:37 +0100
Adam M. [email protected] wrote:

def validate_on_create
if deliverdate <= Date.today
errors.add(:deliverdate, “Datum muss in der Zukunft liegen.”)
end
end
end

ja, wenn du zulaesst, das ein Order-objekt nach ‘create’ auch das datum
ändern kann -
in dem fall:
def validate
$code_von_oben
end

d.h. aber dass du zum zeitpunkt des speicherns immer auch ein valides
datum brauchst.

sie dir mal die hooks an fuer validate: die reihenfolge ist: validate
(generell bei jedem speichern oder anlegen) , validate_on_save (nur
beim speichern, nicht aber beim initialen anlegen) oder eben
validate_on_create ( nur beim initialen anlegen der Order )

gruesse
rene

Hmmmm. Ich meinte natürlich “Hi Adam” too late :wink:

Am 05.02.2009 um 22:41 schrieb Benjamin Behr | mindmatters
<[email protected]

:

Hi Rene,

dann mach aus dem <= einfach ein >. Also statt “deliverdate <=
Date.today” ein “deliverdate > Date.today”.

Schöne Grüße,Benny

Am 05.02.2009 um 22:34 schrieb Adam M. [email protected]:

On Thu, 5 Feb 2009 22:41:43 +0100
Rene P. [email protected] wrote:

(…)

d.h. aber dass du zum zeitpunkt des speicherns immer auch ein valides
datum brauchst.

sie dir mal die hooks an fuer validate: die reihenfolge ist: validate
(generell bei jedem speichern oder anlegen) , validate_on_save (nur
(…)

ich meinte natuerlich validate_on_update…

tzk
rene

Rene P. wrote:

On Thu, 5 Feb 2009 22:41:43 +0100
Rene P. [email protected] wrote:

(…)

d.h. aber dass du zum zeitpunkt des speicherns immer auch ein valides
datum brauchst.

sie dir mal die hooks an fuer validate: die reihenfolge ist: validate
(generell bei jedem speichern oder anlegen) , validate_on_save (nur
(…)

ich meinte natuerlich validate_on_update…

tzk
rene

Also im Moment habe ich

class Order < ActiveRecord::Base
belongs_to :user
has_many :products
belongs_to :raddress

def validate
if deliverdate <= Date.today
errors.add(:deliverdate, “Datum muss in der Zukunft liegen.”)
end
end
end

Und kann immer noch alles mögliche speichern!

On Thu, 5 Feb 2009 22:52:13 +0100
Adam M. [email protected] wrote:

end

end
end

Und kann immer noch alles mögliche speichern!

d.h. auch datum von vorgestern?
oder nur datum von heute?
wenn nur von heute würde ich von datentyp ‘datetime’, ‘time’, oder
‘timestamp’ auf typ ‘date’ umsteigen sofern die uhrzeit egal ist :slight_smile:

denn:

rp@tank:~$ irb
irb(main):001:0> d = Date.today
=> #<Date: 4909735/2,0,2299161>
irb(main):002:0> t = DateTime.now
=> #<DateTime: 4418763148664779/1800000000,1/24,2299161>
irb(main):003:0> d < t
=> true
irb(main):004:0> t < d
=> false

So geht es jetzt

class Order < ActiveRecord::Base
belongs_to :user
has_many :products
belongs_to :raddress

def validate
if deliverdate <= Date.today
errors.add(:deliverdate, “Datum muss in der Zukunft liegen.”)
end
end
end

Gruß und Danke

Moin Adam,

ich war gestern abend scheinbar wirklich nicht mehr auf der Höhe mit
meinem Hinweis. Sorry
dafür.
Trotzdem hier noch ein kleiner Hinweis: Es wäre besser, wenn du nicht
die validate-Methode überschreibst, sondern stattdessen den
dafür vorgesehen Hook benutzt und deine Validierung in eine eigene private
Methode schreibst. Das Ganze hätte dann den Vorteil, dass die validate-
Methode weiterhin (vllt von eingebundenen Modulen) überschreibbar
bleibt, ohne deine Validierung zu überschreiben. Das Ganze sähe dann
ungefähr so aus:

class Order < ActiveRecord::Base
belongs_to :user
has_many :products
belongs_to :raddress

validate :deliverdate_in_the_future

private
def deliverdate_in_the_future
errors.add(:deliverdate, “Datum muss in der Zukunft liegen”) if
deliverdate <= Date.today
end
end

Solltest du jetzt weitere eigene Validierungen hinzufügen wollen,
definierst du im private-Bereich eine weitere Validierungs-Methode und
führst diese einfach nach einem Komma hinter der ersten an:
“validate :deliverdate_in_the_future, :second_own_validation”

Schöne Grüße,Benjamin

Am 05.02.2009 um 23:06 schrieb Adam M. [email protected]:

warum nicht

if deliverdate_changed? && deliverdate <= Date.today

?
Am 06.02.2009 um 10:30 schrieb Thomas R. Koll:

errors.add(:deliverdate, “Datum muss in der Zukunft liegen.”)
Bestellung nicht mehr ändern kannst. Blöde Sache.

Thomas R. “TomK32” Koll || http://tomk32.de || http://ananasblau.com
just a geek trying to change the world
Skype: TomK32 || Mail: [email protected]
About Thomas R. Koll | Flickr


rubyonrails-ug mailing list
[email protected]
http://mailman.headflash.com/listinfo/rubyonrails-ug


Siebert WD
Michael S.
Trappenweg 6, 15749 Mittenwalde, Deutschland

Am 05.02.2009 um 22:34 schrieb Adam M.:

end
end

Das Problem ist aber, dass ich immer noch frühere Dati speichern kann.

Ungefähr heute wirst du feststellen dass du den Bestellstatus der
gestrigen
Bestellung nicht mehr ändern kannst. Blöde Sache.

def validate_delivery_date
if created_at and delivery_date < created_at
errors_add(:delivery_date, “must be in The Future”)
end
end

ciao, tom


Thomas R. “TomK32” Koll || http://tomk32.de || http://ananasblau.com
just a geek trying to change the world
Skype: TomK32 || Mail: [email protected]
About Thomas R. Koll | Flickr