使用 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"
}
]