rails的jbuilder用法

1.GET请求,返回一个对象

GET http://localhost:3000/api/v1/trains/0822

返回结果

{
    "number": "0822",
    "available_seats": [
        "1A",
        "1B",
        "1C",
        "2A",
        "2B",
        "2C",
        "3A",
        "3B",
        "3C",
        "4A",
        "4B",
        "4C",
        "5A",
        "5B",
        "5C",
        "6A",
        "6B",
        "6C"
    ]
}

render的做法

app/controllers/api/v1/trains_controller.rb

def show
  @train = Train.find_by_number!( params[:train_number] )

  render :json => {
    :number => @train.number,
    :available_seats => @train.available_seats
  }
end

jbuilder的做法

app/views/api/v1/trains/show.json.jbuilder

json.number @train.number
json.available_seats @train.available_seats
json.created_at @train.created_at

2.GET请求,返回一个数组

GET http://localhost:3000/api/v1/trains

返回结果

{
    "data": [
        {
            "number": "0822",
            "train_url": "http://localhost:3000/api/v1/trains/0822"
        },
        {
            "number": "0603",
            "train_url": "http://localhost:3000/api/v1/trains/0603"
        },
        {
            "number": "0826",
            "train_url": "http://localhost:3000/api/v1/trains/0826"
        },
        {
            "number": "0642",
            "train_url": "http://localhost:3000/api/v1/trains/0642"
        }
    ]
}

render的做法

app/controllers/api/v1/trains_controller.rb

def index
  @trains = Train.all
  render :json => {
    :data => @trains.map{ |train|
      { :number => train.number,
        :train_url => api_v1_train_url(train.number)
    }
  }
}
end

jbuilder的做法

json.data do
  json.array! @trains do |train|
    json.number train.number
    json.train_url api_v1_train_url(train.number)
  end
end

3.使用partial样板

子项目

app/views/api/v1/trains/_item.json.jbuilder

json.number train.number
json.available_seats train.available_seats
json.created_at train.created_at

修改1

app/views/api/v1/trains/show.json.jbuilder

- json.number @train.number
- json.available_seats @train.available_seats
- json.created_at @train.created_at

+ json.partial! 'item', train: @train

修改2

app/views/api/v1/trains/index.json.jbuilder

 json.data do
-  json.array! @trains do |train|
-    json.number train.number
-    json.train_url api_v1_train_url(train.number)
-  end

+  json.array! @trains, :partial => "item", :as => :train

 end

分页

Gemfile

gem 'will_paginate'

$ bundle install

app/controllers/api/v1/trains_controller.rb

  def index
-   @trains = Train.all
+   @trains = Train.paginate( :page => params[:page] )
  end

app/views/api/v1/trains/index.json.jbuilder

+ json.meta do
+   json.current_page @trains.current_page
+   json.total_pages @trains.total_pages
+   json.per_page @trains.per_page
+   json.total_entries @trains.total_entries

+   if @trains.current_page == @trains.total_pages
+     json.next_url nil # 最后一页就没有下一页了
+   else
+     json.next_url api_v1_trains_url( :page => @trains.next_page )
+   end

+   if @trains.current_page == 1
+     json.previous_url nil # 第一页就没有上一页
+   else
+     json.previous_url api_v1_trains_url( :page => @trains.previous_page )
+   end
+ end

json.data do
  json.array! @trains, :partial => "item", :as => :train
end

模拟数据

$ rails c

> 100.times { |i| Train.create( :number => "T#{i}" ) }

参考资料


全栈营

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 花了两个月做了一个类似 Tower 的GTD工具, 从最开始学习 Ruby 和 Rails, 到跌跌撞撞中摸索 R...
    ManateeLazyCat阅读 16,039评论 7 44
  • Awesome Ruby Toolbox Awesome A collection of awesome Ruby...
    debbbbie阅读 7,978评论 0 3
  • 介绍 objc.io objc.io 是关于 Objective-C 最佳实践和先进技术的期刊,欢迎来到第一期! ...
    评评分分阅读 5,661评论 5 24
  • 一晚的火车,终于在几天上午回到家中。 在快到家这段被乘务员叫醒,洗漱后,站在车窗边,看着窗外沿途的货车,有了一种跳...
    生命的朝拜者阅读 1,521评论 0 0
  • 我有一个幸福温暖的家。家里有我爸爸妈妈和哥哥。虽然它只是一个普普通通的地方,但对于我来说这是一个最完美的地方。我的...
    601661b9e49e阅读 3,051评论 0 1