2009-10-22 9 views
13

Ho lavorato con un modulo di rotaie tutto il giorno e l'ho provato a caso e ho provato la data del 25/12/2009 e mi è venuto fuori un errore enorme .Formato data predefinito in Rails (è necessario ddmmyyyy)

E 'stato a questo punto che mi sono reso conto che i binari sono impostati in modalità data americana (mm/gg/aaaa) anziché in stile Regno Unito: gg/mm/aaaa.

Come posso impostare i binari per gestire automaticamente tutte le date nel formato gg/mm/aaaa?

+1

Irrilevante per la domanda, ma: gg/mm/aaaa è ovunque ma lo stile America, non solo lo standard nel Regno Unito – Pierre

risposta

9

Nelle tue impostazioni del file: 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) 

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

+4

questo si occupa solo di uscita ... questo non è quello che sta chiedere di. – Subimage

+0

Questa è una risposta MOLTO vecchia e non si applica a Rails 4 o 5. – danielricecodes

24

se si sta utilizzando la soluzione nota di @ Chris Ballance che Rails ora modifie s la classe Date direttamente in modo da ottenere un errore uninitialized constant ActiveSupport con la soluzione.

See: uninitialized constant ActiveSupport::CoreExtensions

L'argomento aggiornamento:

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

È possibile modificare il formato della data utilizzando l'internazionalizzazione (I18n)

Basta aggiungere (o modificare) questo nei vostri config/locales /en.yml:

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

I risolto questo problema aggiungendo getter e setter chiamati mydatefield_formatted che fanno esplicitamente ciò che voglio e li usano ovunque. Probabilmente una lista della spesa di ragioni per non farlo, ma mi piace molto così ho pensato di lasciarlo qui.

app/modelli/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 aggiornato ...

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