2015-04-22 4 views
4

У меня есть контроллер, который отображает JSON. В частности, все ticket s связаны с конкретным show. Поэтому, когда пользователь пытается зарезервировать ticket, зарезервирован ticket, а затем список всех ticket s, поскольку JSON отправляется обратно в браузер пользователя для визуализации с помощью некоторого JavaScript.Rails 4.2 рендеринг JSON форматирование DateTime weirdly

Я бег в какой-то странный вывод, хотя, если я создаю show и дать ему 2 ticket с, а затем вызвать 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 
Смежные вопросы