2015-04-22 23 views
4

我有一個呈現JSON的控制器。具體而言,所有的ticket都與特定的show相關聯。因此,當用戶嘗試預訂ticket時,將保留ticket,然後將所有ticket s的列表作爲JSON發送回用戶的瀏覽器以使用某些JavaScript進行呈現。Rails 4.2呈現JSON格式化DateTime奇怪

我遇到了一些奇怪的輸出雖然,如果我創建了一個show,並給它2個ticket S,然後調用ticket.show.tickets.as_json我得到以下Array

{"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

我想你期待as_json作爲json返回對象。這完全不合理的期望!不幸的是,as_json返回「代表模型的散列」。這是一種可配置的返回散列的方式,然後可以很容易地將其轉換爲json與to_json

你的render json: ...調用實際上會爲你調用to_json這意味着你得到了實際的json。只需調用as_json即可獲取從模型屬性到值的映射,但這些值本身不會轉換爲json。

0

當您呈現JSON,它會嘗試以字符串呼籲所有屬性,這就是爲什麼你看到這樣的說法:

: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