【问题标题】:Rails model specific Date formatingRails 模型特定的日期格式
【发布时间】:2016-07-12 05:04:38
【问题描述】:

我有两个模型,即 postcomment。每个模型都有一个名为 created_at 的字段,其数据类型为 date,在呈现 json 响应时,我需要格式化 created_at 字段,但两个模型的字段不同。

对于模型帖子,格式必须为 2016 年 5 月 12 日

评论模型格式为05-12-2016

是否有任何选项可以指定特定于模型的格式?

而且我不想有额外的功能,因为我习惯在不同的地方显示日期,所以如果我写一个函数,我需要在所有地方更改它。

【问题讨论】:

  • JSON 包含 ISO8601 时间和日期格式,然后消费者可以决定如何显示它们不是更有意义吗?将格式问题推到最边缘通常是最好的方法。
  • @muistooshort 我不希望消费者持有控制权。

标签: ruby-on-rails ruby date number-formatting activemodel


【解决方案1】:

您可以直接在模型中创建函数,以随心所欲地返回 created_at 的日期时间。

class Post < ActiveRecord::Base
  def get_date
    created_at.strftime("%b %-d %y")
  end
end

 class Comment < ActiveRecord::Base
   def get_date
     created_at.strftime("%m-%d-%Y")
   end
 end

然后将以下内容放在您的视图中:

<%= @comment.get_date %>

有关使用strftime 方法格式化日期时间的更多方法,请查看:http://apidock.com/ruby/DateTime/strftime

更新(现在的问题反映了对 JSON 的需求)

class Post < ActiveRecord::Base
  def as_json(options)
     super(options).merge({
       :created_at => self.created_at.strftime("%b %-d %y")
     })
  end
end

 class Comment < ActiveRecord::Base
   def as_json(options)
     super(options).merge({
       :created_at => self.created_at.strftime("%m-%d-%Y")
     })
   end
 end

【讨论】:

  • 我不想有额外的功能,因为我习惯在不同的地方显示日期,所以如果我写一个函数,我需要在所有地方都改变它。
  • 最后两个代码块(更新后)仅在使用as_json方法时影响JSON对象。你不必使用任何其他的来工作。
  • 如果我使用 as_json 会正常工作,但如果我不使用 as_json 会怎样。
  • 除了as_json你还会用什么?
  • 我有一个场景,当一些用户在帖子上创建 cmets 时,我需要发送邮件。在名为 notification.html.rb 的邮件视图文件中,我使用的是someone has commented on your post dated &lt;%@post.created_at%&gt;
【解决方案2】:

您应该使用 rails 自动提供的I18n

要设置格式,请转到config/locales/&lt;current_locale&gt;.yml(current_locale 默认为en)。

en:
  time:
    formats:
      default: "%b %-d %y"
      short: "%m-%d-%Y"

在您看来,您可以像这样使用它:

<p><%= I18n.l @post.created_at, format: :default %></p>
<p><%= I18n.l @comment.created_at, format: :short %></p>

或者,如果您想要使用肮脏的非官方方式,您可以在模型中覆盖您的 getter:

class Post < ActiveRecord::Base
  def created_at
    I18n.l(super)    
  end
end

注意这真的很讨厌,因为你覆盖了 created_at 的 getter。因为它是一个日期,你不能再是真正的日期/时间对象。相反,您每次都会得到一个字符串。

请使用 I18n!这是在 Rails 中格式化日期的好方法。

【讨论】:

  • 它是格式化的一种方式,但是有没有任何选项可以为模型模型中的属性设置默认格式
猜你喜欢
  • 2014-05-11
  • 1970-01-01
  • 1970-01-01
  • 2013-01-11
  • 2011-01-15
  • 2015-02-20
  • 1970-01-01
  • 1970-01-01
  • 2018-09-27
相关资源
最近更新 更多