前提・実現したいこと
RailsでバックエンドAPIを作成しようとしています。
そこでPostgreSQL
のJSONB型
がどのようなものか試したく、JSONB型カラムを作成しました。
Postman
というサービスからPOSTメソッドを呼び出して、JSONB型カラムに書き込みをしようと試みたのですが、許可されていないパラメータとして処理がされてしまいます。
POSTメソッド経由でJSONB
型のデータの更新する方法が知りたいです。
発生している問題・エラーメッセージ
以下の写真のように、PostmanからPOSTすると"artist"
のデータがnull
になってしまいます。
コンソール上のエラーは以下の通りです。
console
1Started POST "/songs" for ::1 at 2021-09-26 21:47:41 +0900 2Processing by SongsController#create as */* 3 Parameters: {"song_name"=>"フェイク", "artist"=>{"lyrics_by"=>"Feryquitous", "arranged_by"=>"Feryquitous", "composed_by"=>"Feryquitous"}, "song"=>{"song_name"=>"フェイク", "artist"=>{"lyrics_by"=>"Feryquitous", "arranged_by"=>"Feryquitous", "composed_by"=>"Feryquitous"}}} 4Unpermitted parameters: :artist, :song 5 TRANSACTION (0.3ms) BEGIN 6 ↳ app/controllers/songs_controller.rb:20:in `create' 7 Song Create (2.0ms) INSERT INTO "songs" ("created_at", "updated_at", "song_name") VALUES ($1, $2, $3) RETURNING "id" [["created_at", "2021-09-26 12:47:41.811692"], ["updated_at", "2021-09-26 12:47:41.811692"], ["song_name", "フェイク"]] 8 ↳ app/controllers/songs_controller.rb:20:in `create' 9 TRANSACTION (7.1ms) COMMIT 10 ↳ app/controllers/songs_controller.rb:20:in `create' 11Completed 201 Created in 53ms (Views: 2.4ms | ActiveRecord: 16.9ms | Allocations: 4316)
Unpermitted parameters: :artist, :song
というエラーになってしまい、artist
の中身をnull
で処理してしまっているようです。
フェイク
というstring
型カラムの処理は正常に行われています。
該当のソースコード
songテーブル
を以下のコマンドで作成しました。
console
1rails g scaffold song
その後、カラムを追加しました。
console
1rails g migration AddColumnToSong song_name:string artist:jsonb
以下が、該当のコード群です。
コメントアウトにファイル名があります。
ruby
1# db/migrate/20210926104220_add_column_to_song.rb 2 3class AddColumnToSong < ActiveRecord::Migration[6.1] 4 def change 5 add_column :songs, :song_name, :string 6 add_column :songs, :artist, :jsonb 7 end 8end
ruby
1# db/schema.rb 2 3ActiveRecord::Schema.define(version: 2021_09_26_104220) do 4 5 # These are extensions that must be enabled in order to support this database 6 enable_extension "plpgsql" 7 8 create_table "songs", force: :cascade do |t| 9 t.datetime "created_at", precision: 6, null: false 10 t.datetime "updated_at", precision: 6, null: false 11 t.string "song_name" 12 t.jsonb "artist" 13 end 14end
ruby
1# app/models/concerns/song.rb 2 3class Song < ApplicationRecord 4end
ruby
1# app/controllers/concerns/songs_controller.rb 2 3class SongsController < ApplicationController 4 before_action :set_song, only: [:show, :update, :destroy] 5 6 # GET /songs 7 def index 8 @songs = Song.all 9 10 render json: @songs 11 end 12 13 # GET /songs/1 14 def show 15 render json: @song 16 end 17 18 # POST /songs 19 def create 20 @song = Song.new(song_params) 21 22 if @song.save 23 render json: @song, status: :created, location: @song 24 else 25 render json: @song.errors, status: :unprocessable_entity 26 end 27 end 28 29 # PATCH/PUT /songs/1 30 def update 31 if @song.update(song_params) 32 render json: @song 33 else 34 render json: @song.errors, status: :unprocessable_entity 35 end 36 end 37 38 # DELETE /songs/1 39 def destroy 40 @song.destroy 41 end 42 43 private 44 45 # Use callbacks to share common setup or constraints between actions. 46 def set_song 47 @song = Song.find(params[:id]) 48 end 49 50 # Only allow a list of trusted parameters through. 51 def song_params 52 params.permit( 53 :song_name, 54 :artist 55 ) 56 end 57end
試したこと
seeds.rb
によるデータの作成はうまくいきました。
ruby
1# db/seeds.rb 2 3Song.create( 4 song_name: "Oxydlate", 5 artist: { "composed_by": "Feryquitous", "lyrics_by": "Feryquitous", "arranged_by": "Feryquitous" }, 6)
console
1$ rails db:seed
この値は、確かにPostmanでGET
したときに確認できました。
やはり、POSTした値は"artist": null
となってしまっています。
補足情報(FW/ツールのバージョンなど)
繰り返しになって恐縮ですが、JSONB
型にPOST経由でデータを書き込む方法が知りたいです。
PostgreSQL
、Ruby on Rails
ともに初学者なため、初歩的なことなのかもしれないのができませんでした。
教えていただければ幸いです。
wsl
1rails: rake, version 13.0.6 2ruby: ruby 3.0.2p107 (2021-07-07 revision 0db68f0233) [x86_64-linux] 3node: v14.17.1 4yarn: 1.22.11 5psql: psql (PostgreSQL) 13.4 (Ubuntu 13.4-1.pgdg20.04+1)
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/09/27 03:54