#はじめに
RailsでWebAPIを作成しており、データの登録を行いたいです。
#補足情報
- Rails 5.2
- Ruby 2.5
- apiモードでアプリケーション立ち上げ
#前提条件
以下の通りです。
##テーブル
◆categoriesテーブル
ruby
1class CreateCategories < ActiveRecord::Migration[5.2] 2 def change 3 create_table :categories do |t| 4 t.string :name, null:false, unique: true 5 t.timestamps 6 end 7 end 8end
◆ideasテーブル
ruby
1class CreateIdeas < ActiveRecord::Migration[5.2] 2 def change 3 create_table :ideas do |t| 4 t.references :category, foreign_key: true, type: :bigint, null:false 5 t.text :body, null:false 6 t.timestampsca 7 end 8 end 9end
##モデル
モデルは以下のように関連付けしております。
◆Categoryモデル
ruby
1class Category < ApplicationRecord 2 has_many :ideas 3end
◆Ideaモデル
ruby
1class Idea < ApplicationRecord 2 belongs_to :category 3end
##リクエストの仕方
- category_name(カテゴリー名)
- body(本文)
レスポンス
成功時にstatus 201、失敗時にstatus 422を返す
##登録時の流れ
-
リクエストの category_name が categories テーブルの name に存在する場合、category の id を category_id として、ideas テーブルに登録する。
-
リクエストの category_name が categories テーブルの name に存在しない場合、新たな category として categories テーブルに登録し、ideas テーブルに登録する。
#上記の前提条件を踏まえて
ルーティング及びコントローラーを以下のようにしました。
◆ルーティング
ruby
1Rails.application.routes.draw do 2 namespace 'api' do 3 namespace 'v1' do 4 resources :categories 5 resources :ideas 6 end 7 end 8end
◆Categoriesコントローラー
ruby
1module Api 2 module V1 3 class CategoriesController < ApplicationController 4 before_action :set_category, only: [:show, :update, :destroy] 5 6 # GET /categories 7 def index 8 @categories = Category.all 9 10 render json: { data: @categories } 11 end 12 13 # GET /categories/1 14 def show 15 render json: { data: @category } 16 end 17 18 # POST /categories 19 def create 20 @category = Category.new(category_params) 21 if @category.save 22 render json: { status: 201 } 23 else 24 render json: { status: 422 } 25 end 26 end 27 28 # PATCH/PUT /categories/1 29 def update 30 if @category.update(category_params) 31 render json: @category 32 else 33 render json: @category.errors, status: :unprocessable_entity 34 end 35 end 36 37 # DELETE /categories/1 38 def destroy 39 @category.destroy 40 end 41 42 private 43 # Use callbacks to share common setup or constraints between actions. 44 def set_category 45 @category = Category.find(params[:id]) 46 end 47 48 # Only allow a trusted parameter "white list" through. 49 def category_params 50 params.require(:category).permit(:name) 51 end 52 end 53 end 54end
◆ideasコントローラー
ruby
1module Api 2 module V1 3 class IdeasController < ApplicationController 4 before_action :set_idea, only: [:show, :update, :destroy] 5 6 # GET /ideas 7 def index 8 @ideas = Idea.all 9 render json: { data: @ideas } 10 end 11 12 # GET /ideas/1 13 def show 14 render json: { data: @idea } 15 end 16 17 # POST /ideas 18 def create 19 @idea = Idea.new(idea_params) 20 if @idea.save 21 render json: { status: 201 } 22 else 23 render json: { status: 422 } 24 end 25 end 26 27 # PATCH/PUT /ideas/1 28 def update 29 if @idea.update(idea_params) 30 render json: @idea 31 else 32 render json: @idea.errors, status: :unprocessable_entity 33 end 34 end 35 36 # DELETE /ideas/1 37 def destroy 38 @idea.destroy 39 end 40 41 private 42 # Use callbacks to share common setup or constraints between actions. 43 def set_idea 44 @idea = Idea.find(params[:id]) 45 end 46 47 # Only allow a trusted parameter "white list" through. 48 def idea_params 49 params.require(:idea).permit(:category_name, :body) 50 end 51 end 52 end 53end
#質問内容
"Talend API Tester"を使用して検証しております。
その際、http://localhost:3000/api/v1/ideasのPOSTで
以下のようのなリクエストをしたいのですが、Ideasテーブルには
category_nameが存在しないので、登録ができません。
ruby
1{ 2 "category_name": "アプリ", 3 "body": "顧客管理ツール" 4}
上記リクエストを適用する場合、どのようにすべきでしょうか?
また、リクエストの category_name が categories テーブルの name に存在しない場合についても、ご教示お願いします。
あなたの回答
tips
プレビュー