Rails: настройка атрибута одного объекта, обслуживаемого через jbuilder

Я делаю API, который обслуживает недельные календари (с понедельника по воскресенье) в формате JSON. Прямо сейчас каждый недельный календарь имеет атрибуты «имя» (строка), «start_date» (объект времени, относящийся к понедельнику, в который начинается календарь). Я пытаюсь использовать драгоценный камень jbuilder, который поставляется с Rails.

Проблема:

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, поэтому я надеюсь, что это относительно ясно. Проверьте ожидание представления о том, чего я хочу.


person Guacamolay    schedule 26.02.2015    source источник


Ответы (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"}

Обратите внимание, что тип столбца rails :time не хранит правильную информацию о дате в таблице базы данных — rails использует фиктивную дату 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

конфиг/routes.rb:

get "calendars/(:calendar_id)", to: "calendars#show"
person 7stud    schedule 26.02.2015
comment
Определенно ответ стержня. - person aaron-coding; 27.02.2015