使用 Entity 管理輸出格式

有時候一個 table 會有很多欄位,可能是一些非正規化的資料,但 API 請求不該把 ActiveRecord 給的數據完全顯示。

所以這時候我們就需要一個能夠管理輸出格式的方式,而 grape-entity 正好扮演這個角色

安裝 grape-entity

編輯 Gemfile

  # ...
  gem "grape-entity"
  # ...

記得跑 bundle install

創建 entity 用的資料夾

mkdir app/api/api_v0/entities

建立一個常用的設定作為 entity 的 base 檔案

touch app/api/api_v0/entities/base.rb

這裡我們希望輸出的時間格式採用默認標準 ISO8601,原因是因為這樣的標準不論用任何語言的標準日期庫都能轉換出來,還包含時區訊息。

module ApiV0
  module Entities
    class Base < Grape::Entity
      format_with(:iso8601) { |dt| dt.iso8601 }
    end
  end
end

建立 Post 用的 entity

touch app/api/api_v0/entities/post.rb

設定輸出的格式,這裡我們嘗試不輸出 updated_at 這個欄位

module ApiV0
  module Entities
    class Post < Entities::Base
      expose :id
      expose :title
      expose :context
      expose :created_at, format_with: :iso8601
    end
  end
end

這裡可以看到 class Post < Entities::Base 直接繼承設定,這樣一來就不用每個檔案都寫重複的設定囉

app/api/api_v0/posts.rb

改為 entitiy 管理輸出格式

module ApiV0
  class Posts < Grape::API
    before { authenticate! }

    desc "Get all your posts"
    get "/posts" do
      posts = current_user.posts

      present posts, with: ApiV0::Entities::Post
    end
  end
end

再敲一次 API 是否發現 updated_at 欄位不見了呢?

[
    {
        "id": 2,
        "title": "Hello",
        "context": "World",
        "created_at": "2019-04-05T10:55:38Z"
    }
]
Copyright © NicLin 2019 all right reserved,powered by Gitbook該頁面生成時間: 2019-04-09 10:00:37

results matching ""

    No results matching ""