Est-ce que les rails effectuent une validation pour datetime? J'ai trouvé un plugin http://github.com/adzap/validates_timeliness/tree/master, mais il semble que quelque chose devrait sortir de la boîte.rails construits dans la validation datetime
Répondre
Il n'y a pas intégré dans ActiveRecord validateur pour DateTimes, mais vous pouvez facilement ajouter ce genre de capacité à un modèle ActiveRecord, sans l'aide d'un plug-in, avec quelque chose comme ceci:
class Thing < ActiveRecord::Base
validate :happened_at_is_valid_datetime
def happened_at_is_valid_datetime
errors.add(:happened_at, 'must be a valid datetime') if ((DateTime.parse(happened_at) rescue ArgumentError) == ArgumentError)
end
end
Parfait, merci Gabe. – Daniel
Je suis content que cela a aidé. Ce n'est pas le code le plus glorieux, mais ça fonctionne. –
Merci, c'est génial. Essayé 'validates_timeliness' mais a eu des problèmes en utilisant des getters et setters. Cela a fonctionné parfaitement. –
Il est tout à fait nécessaire de valider Rendez-vous. Avec les helpers de formulaire Rails par défaut, vous pouvez sélectionner des dates comme le 31 septembre.
La validation de l'entrée de l'utilisateur à travers les formulaires est un bon début, mais le contexte de la question suggère que le PO posait des questions sur les validations du modèle de Rails. –
réponse de Gabe ne fonctionnait pas pour moi, voici donc ce que je faisais pour valider mes dates:
class MyModel < ActiveRecord::Base
validate :mydate_is_date?
private
def mydate_is_date?
if !mydate.is_a?(Date)
errors.add(:mydate, 'must be a valid date')
end
end
end
Je cherchais juste de valider que la date est en fait une date, et non une chaîne, caractère, int, float, etc ...
validation de ce jour plus complexe se trouve ici: https://github.com/codegram/date_validator
La gemme est la solution la plus facile, m'a pris trois minutes pour mettre en œuvre. Ça ne vaut pas le coup d'écrire du code. –
@MichaelSchmitz - Il vaut la peine d'écrire du code parce que le code est explicite - les nouvelles personnes regardant le code pourraient ne pas connaître l'existence de ces gemmes et cela ajoute une surcharge supplémentaire pour ce qui est une tâche simple. – Toby
@Toby - merci pour le pointeur, vous avez raison à ce sujet. Je suis le seul développeur pour l'instant, je suppose que j'étais juste heureux que ça a marché. –
Je recommande un petit bijou date_validator
. Voir https://rubygems.org/gems/date_validator. Il est bien entretenu et son API est simple et compacte.
Vous pouvez créer un validateur datetime personnalisé par vous-même
1) créer un dossier nommé validateurs dans le répertoire d'applications à l'intérieur
2) créer un datetime_validator.rb de fichier. avec le contenu suivant dans l'application/validateurs répertoire
class DatetimeValidator < ActiveModel::EachValidator
def validate_each(record, attribute, value)
if ((DateTime.parse(value) rescue ArgumentError) == ArgumentError)
record.errors[attribute] << (options[:message] || "must be a valid datetime")
end
end
end
3) Appliquer cette validation sur le modèle
class YourModel < ActiveRecord::Base
validates :happend_at, datetime: true
end
4) Ajouter la ligne ci-dessous dans application.rb
config.autoload_paths += %W["#{config.root}/app/validators/"]
5) Restart application de votre rail
Remarque: La méthode ci-dessus testée dans les rails 4
Les versions récentes de Rails prendront en charge les valeurs type cast avant la validation. Les valeurs non valides seront donc transmises aux valideurs personnalisés sous la forme nil
. Je fais quelque chose comme ceci:
# app/validators/date_time_validator.rb
class DateTimeValidator < ActiveModel::EachValidator
def validate_each(record, attribute, value)
if record.public_send("#{attribute}_before_type_cast").present? && value.blank?
record.errors.add(attribute, :invalid)
end
end
end
# app/models/something.rb
class Something < ActiveRecord::Base
validates :sold_at, date_time: true
end
# spec/models/something_spec.rb (using factory_girl and RSpec)
describe Something do
subject { build(:something) }
it 'should validate that :sold_at is datetimey' do
is_expected.not_to allow_value(0, '0', 'lorem').for(:sold_at).with_message(:invalid)
is_expected.to allow_value(Time.current.iso8601).for(:sold_at)
end
end
- 1. Travailler avec datetime dans Rails
- 2. Validation multi-états dans Rails
- 3. Validation de formulaire Rails
- 4. rails jquery validation de la forme ajax
- 5. Rails: validation entre colonnes
- 6. Erreurs supprimées lors de la validation avec valide? dans Rails
- 7. Combinant des erreurs de validation dans Rails
- 8. Exécution d'une seule validation dans Rails
- 9. Ruby on Rails symbole validation
- 10. environnement Rails de validation spécifique
- 11. Ruby datetime approprié pour la comparaison mysql
- 12. Transformer DateTime en simple Date dans Ruby on Rails
- 13. validation d'une équation mathématique avec validation des rails
- 14. Rails: Modification des rapports d'erreurs de validation?
- 15. Validation de forme Rails conditionnelle bypass
- 16. Validation des relations de modèle dans les rails
- 17. Erreur de message de validation Rails?
- 18. l'appel des méthodes de validation personnalisées dans Rails
- 19. problème dans la conversion Datetime en C#
- 20. convertir la chaîne à datetime dans ado.net
- 21. DateTime problème dans asp.net
- 22. Comment utiliser datetime dans les conditions d'une recherche/comptage dans Ruby on Rails
- 23. Comment correctement convertir ou interroger la plage de dates pour Rails/MySQL DateTime Colonne
- 24. Selon la façon dont ils sont construits, les rappels peuvent-ils être définis comme des fermetures?
- 25. Bind nullable DateTime à MaskedTextBox
- 26. jQuery Validation Envoi sans validation dans Firefox
- 27. validation dans la boîte texte vba
- 28. Comment gérez-vous la validation dans Silverlight?
- 29. Comment contourner la validation dans dataTable? JSF
- 30. Définir la validation Mime_type dans Symfony
I love 'validates_timeliness'. Il peut être installé comme une gemme. Il était à peu près aussi rapide à installer que copier-coller la réponse sélectionnée. –