我正在制作一个以JSON格式提供周日历(周一至周日)的API。现在每个星期的日历都有属性' name' (字符串),' start_date' (时间对象,指日历开始的星期一)。我正在尝试使用Rails附带的jbuilder gem。
问题:
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的第一个问题,所以我希望这是相对清楚的。检查期望我想要什么。
答案 0 :(得分: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"