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的內容