2009-08-25 7 views
3

Mon simples regex de validation de ce jour ne fonctionne pas correctement ...formats de date Validating dans les rails

validates_format_of :dob, :with => /\d{2}\/\d{2}\/\d{4}/, :message => "^Date must be in the following format: mm/dd/yyyy" 

Qu'est-ce que je manque ici? J'essaie de valider qu'une date est dans le format suivant: mm/jj/aaaa - Quand j'entre ce qui devrait être des données valides, je reçois toujours le message d'erreur.

Merci pour l'aide jusqu'à présent. Voici un extrait de code de ma forme qui passe la valeur DOB dans:

<tr>   
     <td> 
     <%= f.label :dob, "Date of Birth: " %> 
     </td> 
     <td> 
     <%= calendar_date_select_tag "user[dob]", "", :format => :american, :year_range => 50.years.ago..0.years.ago %> 
     </td> 
    </tr> 

Je pense qu'il peut avoir quelque chose à voir avec mon utilisation de ce plugin js calendrier. Un problème connexe est que ma valeur de dob n'est pas maintenue dans le champ si la validation de la publication échoue - la valeur de date précédemment entrée efface ...

Merci!

Tom

Répondre

3

Je n'ai pas testé votre code dans une application Rails, mais votre expression régulière me semble bon. Essayez ce programme de test:

#!/usr/bin/ruby 

str = '08/24/2009' 
regex = /\d{2}\/\d{2}\/\d{4}/ 

if str =~ regex 
    print 'matched', "\n" 
else 
    print 'did not match', "\n" 
end 

Votre expression régulière correspond. Cela suggère que le problème est ailleurs.

Vous pouvez également envisager d'essayer des solutions plus générales pour l'analyse d'une date dans Ruby, telles que la classe Date.parse method de la classe Date. Cela fait un peu plus de validation que votre expression régulière, et il fournit également quelques méthodes utiles pour convertir des dates entre différents formats.

+1

Votre lien est rompu pour Date.parse. Voici une nouvelle fonction [new link to a parse] (http://ruby-doc.org/stdlib-2.0.0/libdoc/date/rdoc/Date.html#method-c-_parse) pour la classe de date, mais il précise spécifiquement que sa fonction n'est pas de valider le format. – Matt

1

La regex me semble correcte. Une ressource utile est http://www.rubyxp.com/, qui testera votre expression régulière par rapport à une chaîne donnée. En effet, l'expression rationnelle que vous avez correspond à une date que j'ai tapée dans rubyxp.

Peut-être y a-t-il un problème pour obtenir les données saisies - une chance que le champ soit vraiment appelé da?

Un autre élément que vous pouvez trouver utile: validates_timeliness, un plugin rails pour valider les dates et heures. Pourquoi juste valider le format de date quand vous pouvez vérifier si c'est une date réelle - après tout, 99/99/9999 validera contre votre regex, mais vous ne pouvez pas vraiment vouloir l'accepter.

0

Vous pouvez également regarder dans le Gem Chronic (http://chronic.rubyforge.org/) qui effectue l'analyse de date naturelle. Ainsi, vous pouvez entrer dans:

mardi prochain à 21 heures

Et il va l'interpréter correctement.

6

Vous utilisez probablement un champ de chaîne pour stocker une date. Par conséquent, les helpers qui attendent une valeur DateTime ou Time ne fonctionneront pas correctement. Vous aurez besoin d'étudier les affectations multiparamétriques dans Rails pour trouver la bonne façon de faire ce que vous voulez faire (les affectations multiparamétriques est la magie derrière l'envoi de 4 champs à Rails et de les convertir en objet DateTime ou Time).

En d'autres termes: si vous utilisez un vrai champ DateTime (comme vous devriez pour ce cas) le validates_format_of n'aura aucun effet (ou aura des effets indésirables)

+0

+1 Cela ressemble vraiment à quelque chose que je devrais regarder - merci! – cakeforcerberus

2

Ahhh!Forcer les formats de date sur l'utilisateur final lorsque Rails les convertit implicitement est une mauvaise chose pour la convivialité, tout en étant plus de travail pour vous (comme vous l'avez vu).

Si vous avez un attribut date/heure dans votre modèle, Rails fera de son mieux pour convertir via Date.Parse (http://www.ruby-doc.org/core/classes/Date.html#M000644), par ex.

u = Somemodel.find :first 

u.created_at 
=> Tue Nov 20 15:44:18 -0500 2007 

u.created_at = '2008/07/03' 
=> "2008/07/03" 

u.created_at 
=> Thu Jul 03 00:00:00 -0400 2008 

u.created_at = '05/10/1980' 
=> "05/10/1980" 

u.created_at 
=> Sat May 10 00:00:00 -0400 1980 
+0

Vous avez certainement raison. Je ne me suis pas rendu compte que Rails a fait de la magie en arrière-plan pour analyser l'entrée de l'utilisateur (un effet secondaire de la programmation en C# pour mon travail de jour :)) - Je suis sûr que je le stocke moment, donc je vais juste passer à une date et supprimer le validates_format_of. Merci :) +1 – cakeforcerberus

+0

@Matt Rogish que faire si vous voulez juste valider que la chaîne est une date sans tenir compte du format de la date? – Mohamad

1

Vous pouvez essayer d'utiliser la date actuelle pour le convertir en quelque chose de format comme son:

def validate_date_format (valeur)

current_date = DateTime.now 
begin 
    DateTime.strptime(current_date, value) 
rescue 
    raise 'Invalid Format' 
end 

fin

Questions connexes