2015-02-26 4 views
1

Я создаю API, который служит в недельных календарях (с понедельника по воскресенье) в формате JSON. Сейчас каждый календарь недели имеет имя атрибута '(строка),' start_date '(объект времени, ссылающийся на понедельник, когда начинается календарь). Я пытаюсь использовать jbuilder gem, который поставляется с Rails.Рельсы: атрибут настройки одного объекта, обслуживаемого jbuilder

Проблема:

1) Calendars GET users/user_id/calendars/calendar_id serves JSON with information about the calendar 
Failure/Error: expect_json({name: calendar.name, start_date: Date.new(2015, 3, 2).strftime('%Y%m%d')}) 

    expected: "20150302" 
     got: "2015-03-02T00:00:00.000Z" 

    (compared using ==) 
# ./spec/requests/calendars_spec.rb:14:in `block (3 levels) in <top (required)>' 

Я хочу, чтобы настроить формат, в котором start_date выводится незначительно, потому что тогда это будет легче иметь дело с на интерфейсе. Это я знаю, как это сделать (Time.now.strformat (% y% m% d) или что-то еще), но я не знаю, как это сделать в контексте jbuilder. Это то, что у меня есть в моем файле JBuilder:

json.extract! @calendar, :name, :start_date 

Я пробовал много синтаксиса от застройщика документы, но все они, кажется, относится к случаям, когда я подаю массив JSON. В этом случае я пытаюсь служить представлению JSON для одной модели.

Мой первый вопрос о stackoverflow, поэтому я надеюсь, что это относительно ясно. Проверьте ожидаемое представление о том, чего я хочу.

ответ

1

JBuilder не требует, чтобы вы использовали только extract!(). Файл .jbuilder может выглядеть следующим образом:

json.name @calendar.name 
json.start_date @calendar.start_date.strftime('%Y-%d-%m') 

Этот синтаксис определяет каждое имя/значение пары, которые вы хотите в вашем JSON на отдельной строке.

В этом примере я пытаюсь служить представлению JSON одной модели .

Выход выше:

{"name":"hello","start_date":"2000-01-01"} 

Обратите внимание, что тип рельсов столбец :time не сохраняет правильную информацию о дате в таблице базы данных - рельсы использует фиктивную дату 2000-01-01. В конце концов, вы сказали, что хотите только сохранить время! Поскольку вы также заинтересованы в дате, вам нужно будет использовать другой тип столбца.

Тест:

спецификации/запросы/calendars_spec.rb:

require 'spec_helper' 

describe "json API" do 

    describe "GET calendars/1.json" do 
    let(:calendar) { FactoryGirl.create(:week_calendar) } #Create a WeekCalendar in the test db, and assign it to the variable calendar. 

    it "returns the correct json" do 
     test_calendar = { 
     name: calendar.name, 
     start_date: calendar.start_date.strftime("%Y-%m-%d"), 
     } 

     visit '/calendars/1.json' 
     expect(page.body).to eq(test_calendar.to_json) 
    end 
    end 


end 

спецификации/factories.rb:

FactoryGirl.define do 
    factory :week_calendar do 
    name   "test" 
    start_date DateTime.new(2015, 2, 26) 
    end 
end 

Gemfile:

group :test do 
    gem 'selenium-webdriver', '2.35.1' 
    gem 'capybara', '2.1.0' 
    gem "factory_girl_rails", "4.2.0" 
end 

приложение/контроллеры/calendars_controller:

class CalendarsController < ApplicationController 
    def show 
    @calendar = WeekCalendar.find(params[:calendar_id]) 
    respond_to :json 
    end 
end 

дБ/Миграции/20150228082528_create_week_calendars.rb:

class CreateWeekCalendars < ActiveRecord::Migration 
    def change 
    create_table :week_calendars do |t| 
     t.string :name 
     t.datetime :start_date 

     t.timestamps 
    end 
    end 
end 

конфигурации/маршруты.rb:

get "calendars/(:calendar_id)", to: "calendars#show" 
+0

Определенно ответ шпильки. –

+0

Замечательно, спасибо. Я неправильно написал - это дата, которую я хочу сохранить. – Guacamolay

Смежные вопросы