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

Copyright © NicLin 2019 all right reserved,powered by Gitbook該頁面生成時間: 2019-04-09 10:00:37

results matching ""

    No results matching ""