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
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
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