Start on Rails5.0 API

Install

Rails5.0需要ruby2.2.3以上版本

rvm install 2.3.0

gem install rails -v 5.0.0.beta3 --pre

Create

我們要做一個前后端分離的應用螃成,后端只需要返回json,前端使用ReactJS來做渲染。

rails new ToySweet --api

rails5.0的api創(chuàng)建模式使得項目精簡了,去掉了rails與瀏覽器相關的一些功能察皇,例如:

This includes things like sessions, cookies, assets, and really anything related to making Rails work with a browser.
Ref: https://blog.codeship.com/building-a-json-api-with-rails-5/

通過對比中間件(rake middleware),我們可以看到api模式下使用的中間件減少了幾項

use Rack::MethodOverride
use WebConsole::Middleware
use ActionDispatch::Cookies
use ActionDispatch::Session::CookieStore
use ActionDispatch::Flash

同時去掉了view泽台,并且ApplicationController繼承自ActionController::API

Database

Database使用Postgres, 在Gemfile中加入

gem 'pg'

然后

bundle install

并將config/database.yml中內容替換為

default: &default  
    adapter: postgresql  
    encoding: unicode  
    pool: 5

development:  
    <<: *default  
    database: toysweet_development

test:  
    <<: *default  
    database: toysweet_test

production:  
    <<: *default  
    database: toysweet_production
    username: toysweet  
    password: <%= ENV['TOYSWEET_DATABASE_PASSWORD'] %>

JSON Is Everything

加入active_model_serializers用來定義返回的JSON格式

gem 'active_model_serializers', '~> 0.10.0.rc1'

生成腳手架listing

rails g scaffold listing content:text title:string

生成的信息如下

invoke  active_record
create    db/migrate/20160319091211_create_listings.rb
create    app/models/listing.rb
invoke    test_unit
create      test/models/listing_test.rb
create      test/fixtures/listings.yml
invoke  resource_route
route    resources :listings
invoke  serializer
create    app/serializers/listing_serializer.rb
invoke  scaffold_controller
create    app/controllers/listings_controller.rb
invoke    test_unit
create      test/controllers/listings_controller_test.rb

別忘了還要做一下migrate什荣。Rails5.0中可以統(tǒng)一用rails來替代rake,所以

rails db:
rails db:setup
rails db:migrate

現(xiàn)在訪問http://localhost:3000/listings/1怀酷,就可以獲得listing

{
  data: 
      {
       id: "1",
       type: "listings",
       attributes: 
             {
                content: "nice thing",
                title: "Dog Tower"
             }
       }
}

模型關系

一個user可以有多個listing稻爬,而一個listing只屬于某一個user

再生成另一個模型User

rails g scaffold user name:string email:string

并在Listing和User中分別添加association

#listings.rb
class Listing < ApplicationRecord  
  belongs_to :user
end

#users.rb
class User < ApplicationRecord
  has_many :listings
end

添加migration

#terminal
rails g migration add_references_to_listings user:references
rails db:migrate

此時兩個model間的關聯(lián)已經建立,于是我們可以這樣子創(chuàng)建一個包含有l(wèi)isting的user

#terminal中運行rails c
user = User.create(name: 'Wang Zhiming', email: 'mimimhmh@qq.com')
user.listings.create(title: 'Bike', content: 'Good to have!')

此時訪問http://localhost:3000/user/1并不會返回user1包含的listing內容蜕依,這是因為返回的json內容是由active_model_serializers來做配置的桅锄。

于是做以下修改

#user_serializer.rb
class UserSerializer < ActiveModel::Serializer
  attributes :id, :name, :email
  has_many :listings
end

#listing_serializer.rb
class ListingSerializer < ActiveModel::Serializer
  attributes :id, :content, :title
  belongs_to :user
end

此時再訪問http://localhost:3000/user/1不光可以得到user1的內容,還能得到其包含的listing的內容

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末笔横,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子咐吼,更是在濱河造成了極大的恐慌吹缔,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,820評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件锯茄,死亡現(xiàn)場離奇詭異厢塘,居然都是意外死亡,警方通過查閱死者的電腦和手機肌幽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評論 3 399
  • 文/潘曉璐 我一進店門晚碾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人喂急,你說我怎么就攤上這事格嘁。” “怎么了廊移?”我有些...
    開封第一講書人閱讀 168,324評論 0 360
  • 文/不壞的土叔 我叫張陵糕簿,是天一觀的道長探入。 經常有香客問我,道長懂诗,這世上最難降的妖魔是什么蜂嗽? 我笑而不...
    開封第一講書人閱讀 59,714評論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮殃恒,結果婚禮上植旧,老公的妹妹穿的比我還像新娘。我一直安慰自己离唐,他們只是感情好病附,可當我...
    茶點故事閱讀 68,724評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著侯繁,像睡著了一般胖喳。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上贮竟,一...
    開封第一講書人閱讀 52,328評論 1 310
  • 那天丽焊,我揣著相機與錄音,去河邊找鬼咕别。 笑死技健,一個胖子當著我的面吹牛,可吹牛的內容都是我干的惰拱。 我是一名探鬼主播雌贱,決...
    沈念sama閱讀 40,897評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼偿短!你這毒婦竟也來了欣孤?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,804評論 0 276
  • 序言:老撾萬榮一對情侶失蹤昔逗,失蹤者是張志新(化名)和其女友劉穎降传,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體勾怒,經...
    沈念sama閱讀 46,345評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡婆排,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,431評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了笔链。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片段只。...
    茶點故事閱讀 40,561評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖鉴扫,靈堂內的尸體忽然破棺而出赞枕,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 36,238評論 5 350
  • 正文 年R本政府宣布鹦赎,位于F島的核電站谍椅,受9級特大地震影響,放射性物質發(fā)生泄漏古话。R本人自食惡果不足惜雏吭,卻給世界環(huán)境...
    茶點故事閱讀 41,928評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望陪踩。 院中可真熱鬧杖们,春花似錦、人聲如沸肩狂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽傻谁。三九已至孝治,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間审磁,已是汗流浹背谈飒。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留态蒂,地道東北人杭措。 一個月前我還...
    沈念sama閱讀 48,983評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像钾恢,于是被迫代替她去往敵國和親手素。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,573評論 2 359

推薦閱讀更多精彩內容