Rails 4.2奇怪地呈现JSON格式化DateTime

时间:2015-04-22 21:51:10

标签: ruby-on-rails

我有一个渲染JSON的控制器。特别是与特定ticket相关联的所有show。因此,当用户尝试保留ticket时,保留ticket,然后将所有ticket作为JSON的列表发送回用户的浏览器以使用某些JavaScript进行渲染。

我遇到了一些奇怪的输出,如果我创建一个show并给它2 ticket s,然后调用ticket.show.tickets.as_json我得到以下Array:< / p>

{"show_id"=>1, "id"=>1, "user_id"=>1, "created_at"=>Wed, 22 Apr 2015 21:47:44 UTC +00:00, "updated_at"=>Wed, 22 Apr 2015 21:47:44 UTC +00:00, "status"=>"open", "reserved_until"=>Wed, 22 Apr 2015 21:57:44 UTC +00:00, "seat_id"=>1}
{"show_id"=>1, "id"=>2, "user_id"=>nil, "created_at"=>Wed, 22 Apr 2015 21:47:44 UTC +00:00, "updated_at"=>Wed, 22 Apr 2015 21:47:44 UTC +00:00, "status"=>"open", "reserved_until"=>nil, "seat_id"=>2}

但是如果我在控制器中运行以下代码,那就是我得到的Array

{"show_id"=>1, "id"=>1, "user_id"=>1, "created_at"=>"2015-04-22T21:47:44.338Z", "updated_at"=>"2015-04-22T21:47:44.345Z", "status"=>"open", "reserved_until"=>"2015-04-22T21:57:44.343Z", "seat_id"=>1}, {"show_id"=>1, "id"=>2, "user_id"=>nil, "created_at"=>"2015-04-22T21:47:44.340Z", "updated_at"=>"2015-04-22T21:47:44.340Z", "status"=>"open", "reserved_until"=>nil, "seat_id"=>2}

TicketsController:

class TicketsController < ApplicationController
  def reserve
    begin
      @ticket = Ticket.find(params[:id])
    rescue
      return
    end
    @ticket.reserve_ticket current_or_guest_user

    render json: @ticket.show.tickets
  end
end

我尝试在控制器中调用render json: @ticket.show.tickets.as_json,但我也有同样的事情。

2 个答案:

答案 0 :(得分:2)

我认为您期望as_json将对象作为json返回。这根本不是无理的期望!不幸的是,as_json返回&#34;表示模型&#34;的哈希。这是一种返回哈希的可配置方式,然后可以使用to_json轻松将其转换为json。

您的render json: ...调用实际上会为您调用to_json,这意味着您将获得实际的json。只需as_json调用即可获得从模型属性到值的映射,但这些值本身不会转换为json。

答案 1 :(得分:0)

当你渲染json时,它会尝试为所有属性调用string,这就是你这样看的原因:

:004 > DateTime.now
 => Thu, 23 Apr 2015 00:20:29 +0200 
:005 > DateTime.now.to_s
 => "2015-04-23T00:20:33+02:00" 

您可以在模型中覆盖为json并自定义日期字符串格式:

:006 > DateTime.now.strftime("%d %b %y at %I %p")
 => "23 Apr 15 at 12 AM"

所以在你的模型中:

def as_json(options={})
  {       
    created_at: self.created_at.strftime("%d %b %y at %I %p"),
    show_id: self.show_id,
    user_id: self.user_id,
    id: self.id
  }
end