Rails:调整通过jbuilder提供的单个对象的属性

时间:2015-02-26 20:40:29

标签: ruby-on-rails jbuilder

我正在制作一个以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的第一个问题,所以我希望这是相对清楚的。检查期望我想要什么。

1 个答案:

答案 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"