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

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

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

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

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

Q&A

解決済

1回答

1426閲覧

RailsでPOST経由でJSONB型のカラムにデータを書き込みたい

yosse95ai

総合スコア39

Ruby on Rails 6

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

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

1グッド

1クリップ

投稿2021/09/26 13:22

編集2021/09/26 13:29

前提・実現したいこと

RailsでバックエンドAPIを作成しようとしています。
そこでPostgreSQLJSONB型がどのようなものか試したく、JSONB型カラムを作成しました。

PostmanというサービスからPOSTメソッドを呼び出して、JSONB型カラムに書き込みをしようと試みたのですが、許可されていないパラメータとして処理がされてしまいます。

POSTメソッド経由でJSONB型のデータの更新する方法が知りたいです。

発生している問題・エラーメッセージ

以下の写真のように、PostmanからPOSTすると"artist"のデータがnullになってしまいます。

postmanからのPOST

コンソール上のエラーは以下の通りです。

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したときに確認できました。

seeds.rbでの値の反映

やはり、POSTした値は"artist": nullとなってしまっています。

補足情報(FW/ツールのバージョンなど)

繰り返しになって恐縮ですが、JSONB型にPOST経由でデータを書き込む方法が知りたいです。
PostgreSQLRuby 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)
shinoharat👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

permit は文字列・日付・数値など決められた値しか通さないようになっています。
JSON データを許可したい場合は、以下のように空ハッシュを指定してください。

diff

1 def song_params 2 params.permit( 3 :song_name, 4- :artist 5+ artist: {} 6 ) 7 end

--

配列で許可するキーを列挙することも可能です。

diff

1 def song_params 2 params.permit( 3 :song_name, 4- :artist 5+ artist: [:lyrics_by, :arranged_by, :composed_by] 6 ) 7 end

--

詳しくは以下のドキュメントをご覧ください。

ActionController::Parameters#permit | Ruby on Rails API

投稿2021/09/26 15:14

shinoharat

総合スコア1685

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

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

yosse95ai

2021/09/27 03:54

ありがとうございます。できました。 公式ドキュメントから逃げずに、ちゃんと見なければなりませんね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問