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

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

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

共收到 12 条回复

#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了,这样前端处理更简单

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