Je souhaite valider une date dans mon modèle dans Ruby on Rails, cependant, les valeurs du jour, du mois et de l'année sont déjà converties en une date incorrecte au moment où elles atteignent mon modèle.
Par exemple, si j'entre le 31 février 2009 à mon avis, lorsque j'utilise Model.new(params[:model])
dans mon contrôleur, il le convertit en "3 mars 2009", que mon modèle considère alors comme une date valide, ce qui est le cas, mais c'est incorrect.
J'aimerais pouvoir faire cette validation dans mon modèle. Y a-t-il moyen de le faire ou est-ce que je me trompe complètement?
J'ai trouvé cette " Date de validation " qui traite du problème mais elle n'a jamais été résolue.
ruby-on-rails
ruby
validation
date
Megamug
la source
la source
Réponses:
Je suppose que vous utilisez l'
date_select
assistant pour générer les balises pour la date. Une autre façon de le faire est d'utiliser l'assistant de sélection de formulaire pour les champs jour, mois et année. Comme ceci (l'exemple que j'ai utilisé est le champ de date created_at):Et dans le modèle, vous validez la date:
Si vous recherchez une solution de plugin, je vérifierais le plugin validates_timeliness . Cela fonctionne comme ceci (à partir de la page github):
La liste des méthodes de validation disponibles est la suivante:
la source
Utilisation de la gemme chronique:
la source
Chronic.parse(from_date_before_type_cast)
pour obtenir l'entrée de valeur de chaîne. Sinon, Rails transtypait la chaîne avecto_date
puisque le champ était undatetime
champ.Si vous voulez une compatibilité avec Rails 3 ou Ruby 1.9, essayez le gem date_validator .
la source
L'enregistrement actif vous donne des
_before_type_cast
attributs qui contiennent les données d'attribut brutes avant la conversion de type. Cela peut être utile pour renvoyer des messages d'erreur avec des valeurs pré-typées ou simplement pour effectuer des validations qui ne sont pas possibles après le typage.J'éviterais la suggestion de Daniel Von Fange de remplacer l'accesseur, car faire la validation dans un accesseur modifie légèrement le contrat de l'accesseur. L'enregistrement actif a une fonctionnalité explicitement pour cette situation. Utilise le.
la source
Étant donné que vous devez gérer la chaîne de date avant qu'elle ne soit convertie en date dans votre modèle, je remplacerais l'accesseur pour ce champ
Disons que votre champ de date est
published_date
. Ajoutez ceci à votre objet modèle:la source
Un peu tard ici, mais grâce à " Comment valider une date dans les rails? " J'ai réussi à écrire ce validateur, j'espère qu'il sera utile à quelqu'un:
À l'intérieur de votre
model.rb
la source
Voici une réponse non chronique.
la source
"1/1/2013".is_a?(Date)
- La date provient de l'entrée de l'utilisateur, elle est donc alimentée sous forme de chaîne. Je devrais d'abord l'analyser comme une date?Date.parse("1/1/2013").is_a?(Date)
, mais vous pouvez voir que s'il n'analyse pas du tout, ce n'est probablement pas non plus une date.Vous pouvez valider la date et l'heure comme ceci (dans une méthode quelque part dans votre contrôleur avec accès à vos paramètres si vous utilisez des sélections personnalisées) ...
la source
Avez-vous essayé le
validates_date_time
plug-in?la source