2009-10-22 13 views
13

He estado trabajando con una forma de rieles todo el día y solo estaba probando aleatoriamente y probé la fecha 25/12/2009 y se me ocurrió un gran error .Formato de fecha predeterminado en los rieles (Necesito que sea ddmmyyyy)

Fue en este punto cuando me di cuenta de que los rieles están configurados en modo de fecha americano (mm/dd/aaaa) en lugar del estilo del Reino Unido: dd/mm/aaaa.

¿Cómo puedo configurar los carriles para tratar automáticamente todas las fechas en formato dd/mm/aaaa?

+1

irrelevante a la pregunta, pero: dd/mm/aaaa está en todas partes pero el estilo América, no sólo el estándar en el Reino Unido – Pierre

Respuesta

9

En la configuración del archivo: config/environment.rb"

my_date_formats = { :default => '%d/%m/%Y' } 

ActiveSupport::CoreExtensions::Time::Conversions::DATE_FORMATS.merge!(my_date_formats) 

ActiveSupport::CoreExtensions::Date::Conversions::DATE_FORMATS.merge!(my_date_formats) 

fuente: http://thedevelopercorner.blogspot.com/2009/03/change-default-date-format-in-ruby-on.html

+4

esto sólo se ocupa de la producción ... esto no es lo que es preguntar por. – Subimage

+0

Esta es una respuesta MUY antigua y no se aplica a Rails 4 o 5. – danielricecodes

24

Si está utilizando la solución de nota @ Chris Ballance que Rails ahora modifie s la clase Date directamente, por lo que obtendrá un error uninitialized constant ActiveSupport con la solución.

Ver: uninitialized constant ActiveSupport::CoreExtensions

El argumento actualización:

my_date_formats = { :default => '%d/%m/%Y' } 
Time::DATE_FORMATS.merge!(my_date_formats) 
Date::DATE_FORMATS.merge!(my_date_formats) 
6

Puede cambiar el formato de fecha utilizando la internacionalización (i18n)

Sólo añadir (o modificar) esto en sus config/locales /en.yml:

en: 
    date: 
    order: 
     - :day 
     - :month 
     - :year 
0

I Resolvió esto agregando getters y setters llamados mydatefield_formatted que explícitamente hacen lo que quiero, y los usan en todas partes. Probablemente una lista de compras de razones para no hacer esto, pero me gusta bastante, así que pensé en dejarlo aquí.

app/modelos/mymodel.rb

class Mymodel < ActiveRecord::Base 
    include ValueFormatters 
    add_value_formatters 

    etc. 
end 

lib/value_formatters.rb

module ValueFormatters 
    extend ActiveSupport::Concern 

    module ClassMethods 

    def add_value_formatters 
     columns.each do |column| 
     case column.type 
      when :datetime 
      define_method("#{column.name}_formatted") { General.format_datetime(self.read_attribute(column.name)) } 
      define_method("#{column.name}_formatted=") {|value| self.update_attribute(column.name, General.parse_datetime(value)) } 
      when :date 
      define_method("#{column.name}_formatted") { General.format_date(self.read_attribute(column.name)) } 
      define_method("#{column.name}_formatted=") {|value| self.update_attribute(column.name, General.parse_date(value)) } 
      when :boolean 
      define_method("#{column.name}_formatted") { General.format_boolean(self.read_attribute(column.name)) } 
      define_method("#{column.name}_formatted=") {|value| self.update_attribute(column.name, General.parse_boolean(value)) } 
      else 
      # do nothing 
     end unless self.class.respond_to?("#{column.name}_formatted") 
     end 
    end 

    end 

end 

lib/general.rb

class General 

    def self.parse_date(value, end_of_day = false) 
    result = nil 
    begin 
     if value.present? 
     if value.length == 8 
      result = DateTime.strptime(value, '%d/%m/%y') 
      if result.year > Time.new.year + 1 
      result = DateTime.new(result.year - 100, result.month, result.day) 
      end 
     else 
      result = DateTime.strptime(value, '%d/%m/%Y') 
     end 
     end 
    rescue Exception=>e 
     # 
    end 
    result = result + 23.hours + 59.minutes + 59.seconds if result && end_of_day 
    result 
    end 

    def self.parse_datetime(value) 
    result = nil 
    begin 
     if value.present? 
     result = DateTime.strptime(value, '%d/%m/%Y %H:%M') 
     result = nil if result < 100.years.ago 
     end 
    rescue Exception=>e 
     # 
    end 
    result 
    end 

    def self.format_date(value) 
    value.present? ? value.strftime('%d/%m/%Y') : '' 
    end 

    def self.format_datetime(value) 
    value.present? ? value.strftime('%d/%m/%Y at %H:%M') : '' 
    end 

    def self.format_boolean(value, default = nil) 
    value = default if value == nil 
    case value 
     when true 
     'Yes' 
     when false 
     'No' 
     else 
     'Unspecified' 
    end 
    end 

    def self.parse_boolean(value, default = false) 
    case value.to_s.downcase 
     when 'true' 
     when 'yes' 
     when '1' 
     when 'on' 
     true 
     when 'false' 
     when 'no' 
     when '0' 
     when 'off' 
     false 
     else 
     default 
    end 
    end 

end 
1

I18n Actualizado ...

date: 
    formats: 
    default: "%m/%d/%Y" 
    short: "%b %d" 
    long: "%B %d, %Y" 
Cuestiones relacionadas