Hitsuji_monのブログ~ 村上春樹のあれ ~

文学好きな組み込み系エンジニア

Rails RubyでAPI作成 ~JSON形式のデータをcurlでPOSTできないとき~

RailsAPIアプリの作成
ここら辺を参考にした
主にこれ
qiita.com

www.sejuku.net

qiita.com

ruby-rails.hatenadiary.com

curlJSON形式のデータをPOSTできない.permitの問題だった
これコケたのでメモ。
絶対忘れる。

  • RailsAPIアプリを新規作成。scaffold
$ 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

下記のエラー
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

進捗出たな