2010-03-27 32 views
15

Me he encontrado con un problema con los formatos de fecha en nuestra aplicación Rails.Formato de fecha de ActiveRecord

que tienen un campo de fecha en nuestra opinión, que yo quiero tener formato de dd/mm/aa. Así es como el usuario espera ingresar sus fechas, y el control datepicker utiliza este formato.

Sin embargo, Active Record parece estar esperando dd/mm/aa.

Si entro 01/03/2010, esto se puso en tan 03 de enero de 2010.

Si entro 25/03/2010, esto se puso en un nula.

¿Cómo consigo que ActiveRecord espere el formato de fecha de Su Majescito?

Respuesta

20

Rails 'DateTime intenta detectar el formateo de forma automática. Detectará los siguientes formatos: mm/dd/yy o dd-mm-yy o yyyy-mm-dd o yyyy/mm/dd. Puede parchear mono DateTime.parse, pero prefiero mover este problema al Ver de su aplicación.

Siempre recomiendo usar yyyy-mm-dd [hh:mm:ss] como una representación de cadena para una fecha. Verifique la documentación de su DatePicker si es compatible con múltiples formatos de fecha.

El selector de fecha jQuery por ejemplo tiene esta cubierto con dateFormat (para los datos que se envía al servidor, ajuste este a yyyy-mm-dd), así como altFormat (para la entrada que ve el usuario, establecer este a dd/mm/yyyy).

+3

Hmm .. sí, puedo cambiar el formato en la vista. Esperaba no hacerlo. Me sorprende que ActiveRecord no se pueda localizar así .. –

12

Agregue un archivo llamado rails_defaults.rb al directorio config\initializers; con las siguientes líneas:

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

Reinicie el servidor y listo.

+0

No puedo hacer que esto funcione. Tengo un archivo new_rails_defaults.rb que se creó para mí. Poner esto aquí no funciona. La creación de rails_defaults.rb tampoco funciona. ¿Algo más que podría haber perdido? –

+0

¿Reinició su servidor? –

+1

¡Sí, reinicié la máquina solo para estar seguro! –

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