新手问题 用 jbuilder 输出,时间日期怎样格式化?

fsword · 2012年08月12日 · 最后由 fsword 回复于 2012年08月13日 · 4647 次阅读

现在是用它来帮助 sinatra 输出 json 的,不过时间字段没有专门格式化,土办法当然有,不过我希望有优雅一些的,求教

问题不在 jbuilder 上。

https://github.com/rails/rails/blob/master/activesupport/lib/active_support/core_ext/time/conversions.rb

RAILS 是这么做的。直接 patch Time, Date .

#2 楼 @Saito 这个方法也想到过,不过还要在 render 时配合才行,除非直接覆盖掉 to_s 方法,但是那样就太 mokey 了 包括 @knwang 说的 stamp,其实对 date/time 进行 patch 是很容易的,问题的关键是不要影响其它地方,所以需要理解 jbuilder 的机制,但是我看了一下它的代码,又似乎没有开放这样的渠道。 总之,除非不得已,我并不希望随便 hack

#3 楼 @fsword

请帖下你的代码

#4 楼 @knwang 这个问题恐怕贴代码没啥用,我只是想看看其他人有没有最佳实践

# app.rb 
get '/read' do
  @posts = @current_user.read_posts
  Jbuilder.encode do |json|
    eval(File.read("#{settings.views}/posts.jbuilder"))
  end
end
# posts.jbuilder
json.posts @posts do |json, post|
  json.(post, :token, :title, :content, :created_at, :updated_at)
end

把 created_at 和 updated_at 拆出来就好了

json.(post, :token, :title, :content) json.created_at post.created_at.stamp("Jan 01, 2012") json.updated_at post.updated_at.stamp("Jan 01, 2012")

#6 楼 @knwang 这类解决办法多如牛毛,不过我希望更优雅一些,比如输出的字段根据类型进行 format,而不是这样的硬编码

默认的格式多好...

# 载入 AR 后,model 前,也可以写成一个 module 只给需要的 include
class ActiveRecord::Base
  attribute_method_prefix 'wtfdate_'
  def wtfdate_attribute attr
    send(attr).try :strftime, '>>%Y%m%d<<'
  end
end
post.as_json only: [:token, :title, :content, :wtfdate_created_at, :wtfdate_updated_at]

#9 楼 @luikore 这样生成的字段名是有前缀的,我只是想在 web 这一块统一修改格式,不希望影响到 api 的调用者。 昨天做了一些尝试,发现我好像还没弄对这里是怎么输出的,我以为是调用了每个字段的 to_json 或者 to_s,结果发现似乎不是

[补充] 土了,是 as_json 不是 to_json,翻了 active support 的源码才发现这个错误......

ruby json 添加的 Date#to_json 就是 to_s

activesupport 修改了 Date#to_json,格式和 yaml 和 javascript 的 JSON.stringify() 结果相同,后来觉得污染了就改成 as_json 并加上开关

告诉调用者日期格式是 ISO8601 就可以了吧... 不要自己乱搞弄奇怪的格式...

#11 楼 @luikore 最新进展,我直接输出成 unix time 了,这样前端处理更简单

需要 登录 后方可回复, 如果你还没有账号请 注册新账号