Формат даты по умолчанию в Rails (нужно, чтобы он был ddmmyyyy) - PullRequest
13 голосов
/ 23 октября 2009

Я работал с формой рельсов весь день, и я просто тестировал ее случайным образом, пробовал дату 25/12/2009, и она показала огромную ошибку.

Именно в этот момент я понял, что рельсы установлены в американский режим даты (мм / дд / гггг) вместо стиля Великобритании: дд / мм / гггг.

Как настроить рельсы для автоматической обработки всех дат в формате дд / мм / гггг?

Ответы [ 6 ]

24 голосов
/ 11 января 2012

Если вы используете решение @Chris Ballance, обратите внимание, что Rails теперь напрямую изменяет класс Date, поэтому вы получите ошибку uninitialized constant ActiveSupport с решением.

См: неинициализированная константа ActiveSupport :: CoreExtensions

Обновленный аргумент:

my_date_formats = { :default => '%d/%m/%Y' } 
Time::DATE_FORMATS.merge!(my_date_formats) 
Date::DATE_FORMATS.merge!(my_date_formats)
9 голосов
/ 23 октября 2009

В вашем файле настроек: 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) 

Источник: http://thedevelopercorner.blogspot.com/2009/03/change-default-date-format-in-ruby-on.html

6 голосов
/ 07 декабря 2012

Вы можете изменить формат даты, используя интернационализацию (I18n)

Просто добавьте (или измените) это в вашем config / locales / en.yml:

en:
  date:
    order:
      - :day
      - :month
      - :year
1 голос
/ 08 декабря 2015

Обновлен I18n ...

date:
  formats:
    default: "%m/%d/%Y"
    short: "%b %d"
    long: "%B %d, %Y"
1 голос
/ 13 ноября 2009

Вы ищете что-то подобное, хотя это решение не слишком элегантно.

http://source.mihelac.org/2006/9/13/parsing-european-date-format-in-ruby-rails

0 голосов
/ 03 октября 2013

Я решил это, добавив геттеры и сеттеры с именем mydatefield_formatted, которые явно делают то, что я хочу, и используем их везде. Возможно, список покупок объясняет, почему этого не делать, но мне это очень нравится, поэтому я решил оставить это здесь.

приложение / модели / mymodel.rb

class Mymodel < ActiveRecord::Base
  include ValueFormatters
  add_value_formatters

  etc.
end

Библиотека / 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

Библиотека / 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...