Rails模型特定日期格式化

时间:2016-07-12 05:04:39

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

我有两个模型,即发布评论。每个模型都有一个名为 created_at 的字段,数据类型为日期,而渲染json响应时我需要格式化created_at字段,但两个模型的格式不同。

对于模型Post,格式必须 2016年5月12日

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

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

而且我不想拥有额外的功能,因为我曾经在不同的地方显示日期,所以如果我写一个功能,我需要在所有地方改变它。

2 个答案:

答案 0 :(得分:0)

您可以直接在模型中创建函数,以随心所欲地返回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

答案 1 :(得分:0)

您应该使用自动提供的I18n

要设置格式,请转到config/locales/<current_locale>.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>

或者,如果你想要肮脏的,非官方的方式,你可以在模型中覆盖你的吸气剂:

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

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

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