Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何使Rails 3本地化我的日期格式?_Ruby On Rails_Localization_Internationalization_Ruby On Rails 3 - Fatal编程技术网

Ruby on rails 如何使Rails 3本地化我的日期格式?

Ruby on rails 如何使Rails 3本地化我的日期格式?,ruby-on-rails,localization,internationalization,ruby-on-rails-3,Ruby On Rails,Localization,Internationalization,Ruby On Rails 3,我正在从事一个Rails3项目,在这个项目中,表单中有输入日期的位置。带有日期的文本字段使用日期选择器,因此不必担心以错误格式输入的日期,但日期以:db格式显示(例如2010-01-21) (注意:这在表单字段中是明确的-例如,,它应该自动使用:默认格式,并且不需要提供值) 我已尝试添加具有以下日期配置的自定义区域设置: date: formats: # Use the strftime parameters for formats. # When no form

我正在从事一个Rails3项目,在这个项目中,表单中有输入日期的位置。带有日期的文本字段使用日期选择器,因此不必担心以错误格式输入的日期,但日期以:db格式显示(例如2010-01-21)

(注意:这在表单字段中是明确的-例如,
,它应该自动使用:默认格式,并且不需要提供值)

我已尝试添加具有以下日期配置的自定义区域设置:

date:
    formats:
      # Use the strftime parameters for formats.
      # When no format has been given, it uses default.
      # You can provide other formats here if you like!
      default: "%d/%m/%Y"
      short: "%b %d"
      long: "%B %d, %Y"
然后将我的语言环境设置为这个(
config.i18n.default\u locale=“en AU”
),但是这似乎不需要花费时间,而且它变得非常令人沮丧

该应用程序最终将支持多个区域设置,因此在应用程序启动时设置一个初始值设定项来覆盖日期格式并不太合适,我知道这应该是可行的——我猜我错过了一些东西

语言环境文件是:
config/locales/en AU.yml
,在my application.rb中,我包括:

config.i18n.load_path += Dir[Rails.root.join("config", "locales", "*.yml").to_s]
config.i18n.default_locale = "en-AU"

在my application.rb文件中。

显示日期时,可以使用
I18n.l

所以你会这样做:

I18n.l @entry.created_at
如果要更改其格式:

I18n.l @entry.created_at, :format => :short

正在记录这一点。

查看“去本地化”gem,它可能会帮助您解决一些问题


我发现最好的解决方案是:

  • 我像你一样在我的语言环境文件中本地化日期格式
  • 在我的表单中,我通过直接设置值来本地化日期
(@model.publish\u date.nil??nil:l(@model.publish\u date))%>


遗憾的是,它并不完美,但至少通过这种方式,我可以将我的表格用于新记录和现有记录。与使用初始值设定项更改默认格式相比,该应用程序将与多个地区保持兼容。如果您完全想遵守DRY,您可以编写一个自定义帮助程序。

您可以覆盖
:publish\u date
属性的getter

i、 e.在您的模型中:

def date( *format)
    self[:publish_date].strftime(format.first || default)
end
在你看来,你也可以这样做

@income.date("%d/%m/%Y")

这将导致strftime使用传递的格式字符串,除非它是nil,在这种情况下,它将返回到默认字符串


注意:我使用splat操作符添加了对无参数获取日期的支持。也许有一种更简洁的方法可以做到这一点。

@damien mathieu对于使用
I18n.localize
显示本地化日期有一个可靠的答案,他的评论提出了一个重要的警告:这会打破文本输入。从那时起,rails为我们提供了一个很好的解决方案

从Rails 5开始,您可以使用 自定义如何将用户输入转换为模型或数据库值。事实上,只是没有完整的记录

经过大量的努力,所有模型的类型现在都定义为
ActiveRecord::Type
对象。这定义了如何处理属性的唯一真实来源。类型定义了属性是如何序列化(从ruby类型到数据库类型)、反序列化(从数据库类型到ruby类型)和强制转换(从用户输入到ruby类型)的。这是一个大问题,因为搞乱它曾经是开发人员应该避免的特例雷区

首先,浏览文档以了解如何覆盖属性的类型。你可能需要阅读文档才能理解这个答案

Rails如何转换属性 下面是Rails属性API的快速教程。你可以跳过这一部分,但是你不知道这些东西是如何工作的。那有什么意思

了解Rails如何处理属性的用户输入将使我们只覆盖一个方法,而不是创建更完整的自定义类型。它还将帮助您编写更好的代码,因为rails的代码非常好

由于您没有提到模型,我假设您有一篇带有
:publish_date
属性的
帖子(有些人更喜欢
:published_on
,但我离题了)

你是什么类型的? 找出
:publish\u date
是什么类型。我们不在乎它是
日期的实例,我们需要知道返回的内容:

此方法是与模型属性类型相关的所有信息的唯一有效来源

现在我们知道
:publish\u date
属性是
:date
类型。这是由,whichextends,whichextends定义的。我已经链接到rails 5.1.3,但是您需要阅读版本的源代码

ActiveRecord::Type::Date如何转换用户输入? 因此,当您设置
:publish_date
时,该值将传递给,调用。由于表单输入是一个字符串,它将尝试使用then

如果你迷路了,别担心。定制属性不需要理解rails的代码

定义自定义类型 现在我们已经了解了Rails如何使用attributes API,我们可以轻松地创建自己的API。只需创建一个自定义类型来覆盖
cast\u值
以期望本地化的日期字符串:

class LocalizedDate
看看我是如何复制rails的代码并做了一些小调整的。容易的。您可能希望通过调用
super
并将
:short
格式移动到一个选项或常量来对此进行改进

注册您的类型,以便它可以被符号引用:

#config/initializers/types.rb
ActiveRecord::Type.register(:本地化日期,本地化数据)
O
@income.date
$ rails c
> post = Post.where.not(publish_date: nil).first
> post.publish_date.class
=> Date
> Post.type_for_attribute('publish_date').type
=> :date