2010-03-27 7 views
15

J'ai rencontré des problèmes avec les formats de date dans notre application Rails.Format de date ActiveRecord

J'ai un champ de date à notre avis que je veux être formaté comme jj/mm/aa. C'est ainsi que l'utilisateur s'attend à entrer ses dates, et le contrôle datepicker utilise ce format.

Cependant, Active Record semble être attendre mm/jj/aa.

Si j'entre 01/03/2010, cela devient comme mis en 03 Janvier 2010.

Si j'entre 25/03/2010, cela se met dans une nulle.

Comment puis-je demander à ActiveRecord d'attendre le format de date de Her Majesties?

Répondre

20

La fonction DateTime de Rails tente de détecter automatiquement le formatage. Il détectera les formats suivants: mm/dd/yy ou dd-mm-yy ou yyyy-mm-dd ou yyyy/mm/dd. Vous pouvez corriger le singe DateTime.parse, mais je préfère déplacer ce problème vers le Voir de votre application.

Je recommande toujours d'utiliser yyyy-mm-dd [hh:mm:ss] comme représentation sous forme de chaîne pour une date. Vérifiez la documentation de votre DatePicker s'il prend en charge plusieurs formats de date.

La jQuery dattier par exemple a ce couvert de dateFormat (pour les données qui sont envoyées au serveur, réglez ce paramètre yyyy-mm-dd) ainsi que altFormat (pour l'entrée que l'utilisateur voit, réglez ce paramètre dd/mm/yyyy).

+3

Hmm .. oui je peux changer le format dans la vue. J'espérais ne pas le faire. Cela m'étonne que ActiveRecord ne puisse pas être localisé comme ceci .. –

12

Ajouter un fichier appelé rails_defaults.rb au répertoire config\initializers; avec les lignes suivantes:

Date::DATE_FORMATS[:default] = '%d/%m/%Y' 
Time::DATE_FORMATS[:default]= '%d/%m/%Y %H:%M:%S' 

Redémarrez le serveur et vous voilà prêt à partir.

+0

Je ne peux pas obtenir ceci pour fonctionner. J'ai un fichier new_rails_defaults.rb qui a été créé pour moi. Mettre cela ici ne fonctionne pas. La création de rails_defaults.rb ne fonctionne pas non plus. Y a-t-il d'autres choses que j'ai pu manquer? –

+0

Avez-vous redémarré votre serveur? –

+1

Oui, redémarré la machine juste pour s'assurer! –

2
class Date 
    class << self 
    def _parse_with_us_format(date, *args) 
     if date =~ %r{^(\d+)/(\d+)/(\d+)$} 
     _parse_without_us_format("#{$3.length == 2 ? "20#{$3}" : $3}-#{$1}-#{$2}", *args) 
     else 
     _parse_without_us_format(date, *args) 
     end 
    end 
    alias_method_chain :_parse, :us_format 
    end 
end