Skip to content

Latest commit

 

History

History
179 lines (121 loc) · 4.58 KB

Chapter11: Creating the Rails API.md

File metadata and controls

179 lines (121 loc) · 4.58 KB

Creating the Rails API

我们需要一个和Ember沟通的Rails API,以便于保存和检索数据.

The Active Model Adapter

当我们使用Ember Rails生成器命令设置Ember时,它添加了一个叫做Active Model Adapter的东东.如果你打开store.js就会看到它:

// app/assets/javascripts/store.js
App.Store = DS.Store.extend({});
App.ApplicationAdapter = DS.ActiveModelAdapter.extend({});

如果你没有看到这段代码,那就用它替换掉你的store.js中的内容.

Active Model Adapter可以让Ember通过Active Model Serializers与Rails后端沟通,通常你需要引入active_model_serializers gem,但是Ember Rails已经有它作为一个依赖项.

命名空间API请求

我们需要告诉Ember使用api/v1/预设所有的API请求,我们会对api进行版本控制,将这两行代码添加到store.js的顶部:

// app/assets/javascripts/store.js
DS.RESTAdapter.reopen({
  namespace: 'api/v1'
})

在Rails中建模Leads

首先创建我们的leads:

rails g migration create_leads first_name:string last_name:string email:string phone:string status:string notes:text

打开migration并且确保添加时间戳:

class CreateLeads < ActiveRecord::Migration
  def change
    create_table :leads do |t|
      t.string :first_name
      t.string :last_name
      t.string :email
      t.string :phone
      t.string :status
      t.text :notes

      t.timestamps
    end
  end
end

运行migration:

rake db:migrate

现在我们创建Rails模型:

# app/models/lead.rb
class Lead < ActiveRecord::Base
end

The Rails Serializer

添加序列化器,你需要列出想要序列化到JSON并且发给Ember的所有的特性(attribute):

# app/serializers/lead_serializer.rb
class LeadSerializer < ActiveModel::Serializer
  attributes :id, :first_name, :last_name, :email, :phone, :status, :notes
end

API控制器

现在,我们有了我们的模型和序列化器,我们可以创建API控制器了.

首先我们需要API控制器的路由,把它们添加到Rails router的顶部:

# config/routes.rb
namespace :api do
  namespace :v1 do
    resources :leads
  end
end

现在创建控制器,这里都是相当标准的行为:

# app/controllers/api/v1/leads_controller.rb
class Api::V1::LeadsController < ApplicationController
  respond_to :json

  def index
    respond_with Lead.all
  end

  def show
    respond_with lead
  end

  def create
    respond_with :api, :v1, Lead.create(lead_params)
  end

  def update
    respond_with lead.update(lead_params)
  end

  def destroy
    respond_with lead.destroy
  end

  private

  def lead
    Lead.find(params[:id])
  end

  def lead_params
    params.require(:lead).permit(:first_name, :last_name, :email, :phone, :status, :notes)
  end

end

See it in Action

我们创建一些记录,看看我们的API实际的工作.

首先添加ffaker gem:

# Gemfile
gem 'ffaker'

然后创建一个populate任务:

# lib/tasks/populate.rake
namespace :db do
  task populate: :environment do

    Lead.destroy_all

    def random_status
      ['new', 'in progress', 'closed', 'bad'].sample
    end

    20.times do
      Lead.create(
        first_name: Faker::Name.first_name,
        last_name: Faker::Name.last_name,
        email: Faker::Internet.email,
        phone: Faker::PhoneNumber.phone_number,
        status: random_status,
        notes: Faker::HipsterIpsum.words(10).join(' ')
        )
    end

  end
end

我们使用Hipster Ipsum做为备注,来增添乐趣.

运行populate任务:

rake db:populate

重启服务器,现在你应该可以访问http://localhost:3000/api/v1/leads.json 并且看到所有leads的JSON.http://localhost:3000/api/v1/leads/1.json会显示第一个lead.

Puma

虽然我们使用Rails做一些微不足道的事情,但是我们要从Webrick切换到Puma,它更快并且支持多线程,你必须要添加Puma到你的Gemfile:

# Gemfile
gem 'puma'

Bundler并且重启你的服务器.

这就是Rail方面的一切!现在,我们可以开始有趣的事情了.