我有两个模型,即发布和评论。每个模型都有一个名为 created_at 的字段,数据类型为日期,而渲染json响应时我需要格式化created_at字段,但两个模型的格式不同。
对于模型Post,格式必须 2016年5月12日
评论模型格式为 05-12-2016
是否有任何选项可以指定特定于模型的格式?
而且我不想拥有额外的功能,因为我曾经在不同的地方显示日期,所以如果我写一个功能,我需要在所有地方改变它。
答案 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中格式化日期的好方法。