Rails RubyでAPI作成 ~JSON形式のデータをcurlでPOSTできないとき~
curlでJSON形式のデータをPOSTできない.permitの問題だった
これコケたのでメモ。絶対忘れる。
$ rails new api-project --api $ rails g scaffold users
- controllerにJSONデータを受けた時の返し方が書かれてる
class UsersController < ApplicationController before_action :set_user, only: [:show, :update, :destroy] # GET /users def index @users = User.all render json: @users end # GET /users/1 def show render json: @user end # POST /users def create @user = User.new(user_params) if @user.save render json: @user, status: :created, location: @user else render json: @user.errors, status: :unprocessable_entity end end ~~~ private ~~~ # Only allow a trusted parameter "white list" through. def user_params params.fetch(:user, {}) end end
- curl -X POST http://localhost:3000/users -d 'user[name]=meru'
下記のエラー
Error:ActiveModel::ForbiddenAttributesError
POSTできないやんけ!!!
Error:ActiveModel::ForbiddenAttributesError
原因- Rails4のコア機能であるStrong Parametersの仕様による「検証通ってないよー」というエラーだそうです。
- パラメータに許可を与えなくてはいけない
strong parameterのパラメータに.permitメソッドを追加すればいい
変更前
class UsersController < ApplicationController before_action :set_user, only: [:show, :update, :destroy] ~ # POST /users def create @user = User.new(user_params) if @user.save render json: @user, status: :created, location: @user else render json: @user.errors, status: :unprocessable_entity end end ~~~ private ~~~ # ここが問題だった def user_params params.fetch(:user, {}) end end
変更後
class UsersController < ApplicationController before_action :set_user, only: [:show, :update, :destroy] ~ # POST /users def create @user = User.new(user_params) if @user.save render json: @user, status: :created, location: @user else render json: @user.errors, status: :unprocessable_entity end end ~~~ private ~~~ # createアクションに渡すstrong_parameterに許可.permitを与える def user_params params.fetch(:user, {}).permit(:users, :name, :string) end end
進捗出たな