Post#create 要能建立文章
加入 Create 的 API endpoint
module ApiV0
class Posts < Grape::API
#...
desc "Create new post"
params do
requires :title, type: String
requires :context, type: String
end
post "/posts" do
post = current_user.posts.new(declared(params, include_missing: false).except(:access_key))
if post.save
present post, with: ApiV0::Entities::Post
else
raise StandardError, $!
end
end
#...
end
end
這邊會用 declared 去濾 params 是因為這時候的設計 access_key 是放在 params 裡面,如果跟著帶進來會噴 error,因為 Post 這個 model 裡面並沒有 access_key
這個欄位會造成錯誤。
所以比較好的方式是把帶 access_key 放在 header 裡面檢查。
但本書除了介紹這種簡易的 auth 方法,也順便解說 params 要怎麼濾,因為 grape 不見得能直接使用 rails strong param,通常帶進來的參數不會像是 form 送出去的會包很多層 hash
因為 form 送進來的可能是
{ posts: { title: "Hi", context: "Man" } }
所以可以直接這樣用
params.required(:posts).permit(:title, :context)
但通常 API 送進來的都是單層的
{ title: "Hi", context: "Man" }
用 strong params 是沒辦法濾掉的,下面這樣做會直接返回 null
params.permit(:title, :context)
這裡才會用 grape 提供的 declared 去做處理
可以參考如何把 declared 包成一個通用的 grape helper