質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

0回答

748閲覧

[Rails] APIの作成について(データの登録をしたい)

ozk

総合スコア9

Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

1クリップ

投稿2020/05/31 08:48

#はじめに
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 に存在しない場合についても、ご教示お願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問