2009-10-22 10 views
13

Pracowałem z szyną przez cały dzień, a ja po prostu losowo testowałem i wypróbowałem datę 25/12/2009 i pojawił się wielki błąd .Domyślny format daty w Railsach (wymagany, aby był ddmmyyyy)

W tym momencie zdałem sobie sprawę, że tory są ustawione w amerykańskim trybie daty (mm/dd/rrrr) zamiast w stylu brytyjskim: dd/mm/rrrr.

Jak ustawić tory, aby automatycznie obsługiwały wszystkie daty w formacie dd/mm/rrrr?

+1

nieistotne pytanie ale: dd/mm/rrrr jest wszędzie, ale styl Ameryka, a nie tylko średnia w Wielkiej Brytanii – Pierre

Odpowiedz

9

W ustawieniach pliku: 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) 

źródło: http://thedevelopercorner.blogspot.com/2009/03/change-default-date-format-in-ruby-on.html

+4

ten obsługuje tylko wyjście ... to nie to, co jest pytać o. – Subimage

+0

To jest BARDZO stara odpowiedź i nie dotyczy Railsów 4 lub 5. – danielricecodes

24

Jeśli używasz notatka rozwiązanie @Chris Ballance, że Rails teraz Modifié s klasa Date bezpośrednio, więc otrzymasz błąd uninitialized constant ActiveSupport z rozwiązaniem.

Patrz: uninitialized constant ActiveSupport::CoreExtensions

Zaktualizowana argumentem:

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

Można zmienić format daty przy użyciu internacjonalizacji (I18n)

Wystarczy dodać (lub zmiany) to w config/locales /en.yml:

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

I rozwiązał to przez dodanie modułów pobierających i ustawiających o nazwach mydatefield_formatted, które jawnie robią to, co chcę i używają ich wszędzie. Prawdopodobnie lista zakupów z tego powodu, ale nie podoba mi się to, więc pomyślałem, że zostawię to tutaj.

app/wzory/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

Aktualizacja I18n ...

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