我有一个渲染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
,但我也有同样的事情。
答案 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