Forum: Rails Germany Validieren ob Datum in der Zukunft liegt

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Adam M. (Guest)
on 2009-02-05 22:11
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
Rene P. (Guest)
on 2009-02-05 22:44
(Received via mailing list)
On Thu, 5 Feb 2009 21:11:38 +0100
Adam M. <removed_email_address@domain.invalid> 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
Adam M. (Guest)
on 2009-02-05 23:34
Rene P. wrote:
> On Thu, 5 Feb 2009 21:11:38 +0100
> Adam M. <removed_email_address@domain.invalid> 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.
Rene P. (Guest)
on 2009-02-05 23:42
(Received via mailing list)
On Thu, 5 Feb 2009 22:34:37 +0100
Adam M. <removed_email_address@domain.invalid> 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
Benjamin Behr | mindmatters (Guest)
on 2009-02-05 23:42
(Received via mailing list)
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. <removed_email_address@domain.invalid>:
Benjamin Behr | mindmatters (Guest)
on 2009-02-05 23:44
(Received via mailing list)
Hmmmm. Ich meinte natürlich "Hi Adam" *too late* ;)

Am 05.02.2009 um 22:41 schrieb Benjamin Behr | mindmatters
<removed_email_address@domain.invalid
 >:
Rene P. (Guest)
on 2009-02-05 23:48
(Received via mailing list)
On Thu, 5 Feb 2009 22:41:43 +0100
Rene P. <removed_email_address@domain.invalid> 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
Adam M. (Guest)
on 2009-02-05 23:52
Rene P. wrote:
> On Thu, 5 Feb 2009 22:41:43 +0100
> Rene P. <removed_email_address@domain.invalid> 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!
Rene P. (Guest)
on 2009-02-06 00:01
(Received via mailing list)
On Thu, 5 Feb 2009 22:52:13 +0100
Adam M. <removed_email_address@domain.invalid> 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
Adam M. (Guest)
on 2009-02-06 00:06
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
Benjamin Behr | mindmatters (Guest)
on 2009-02-06 09:36
(Received via mailing list)
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. <removed_email_address@domain.invalid>:
Thomas r. K. (Guest)
on 2009-02-06 11:35
(Received via mailing list)
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: removed_email_address@domain.invalid
http://flickr.com/people/tomk32
Michael S. (Guest)
on 2009-02-07 10:02
(Received via mailing list)
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: removed_email_address@domain.invalid
> http://flickr.com/people/tomk32
>
> _______________________________________________
> rubyonrails-ug mailing list
> removed_email_address@domain.invalid
> http://mailman.headflash.com/listinfo/rubyonrails-ug

---
Siebert WD
Michael S.
Trappenweg 6, 15749 Mittenwalde, Deutschland
This topic is locked and can not be replied to.