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

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

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

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Ruby on Rails

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

Q&A

解決済

2回答

833閲覧

複数のデータと紐付けたデータをRailsコンソールから登録したい

mikichi8

総合スコア0

Ruby

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Ruby on Rails

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

0グッド

0クリップ

投稿2020/04/23 08:29

前提・実現したいこと

Ruby(Rails5)でイラストを投稿するAPIを作っています。
外部からAPIを呼び出した際に、JSON形式でポストのデータを返す所を確認したかったので、
ひとまずRailsコンソールからデータを登録することにしました。

後ほどソースコードを示しますが、ポスト(post)のデータを記録するためには、紐付けるユーザー(user)とテーマ(theme)が必要なのでRailsコンソールからそれぞれ2つずつデータを登録してあります。

その後それらと紐付けてポストのデータを登録しようとしたところ以下のエラーメッセージが発生しました。

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

pry(main)> Post.create(title:'test',content:'testtest',illust:'test.png',user_id:1,theme_id:1) (0.1ms) begin transaction User Load (0.1ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT ? [["id", 1], ["LIMIT", 1]] Theme Load (0.1ms) SELECT "themes".* FROM "themes" WHERE "themes"."id" = ? LIMIT ? [["id", 1], ["LIMIT", 1]] (0.1ms) rollback transaction

該当のソースコード

Ruby

1#schema.rb 2ActiveRecord::Schema.define(version: 20200423053204) do 3 4 # 5 # そのほかのテーブル 6 # 7 8 #ポストモデル 9 create_table "posts", force: :cascade do |t| 10 t.string "title" 11 t.string "content" 12 t.string "illust" 13 t.integer "user_id" 14 t.datetime "created_at", null: false 15 t.datetime "updated_at", null: false 16 t.integer "theme_id" 17 t.index ["theme_id"], name: "index_posts_on_theme_id" 18 t.index ["user_id"], name: "index_posts_on_user_id" 19 end 20 21 #テーマモデル 22 create_table "themes", force: :cascade do |t| 23 t.string "theme" 24 t.datetime "created_at", null: false 25 t.datetime "updated_at", null: false 26 end 27 28 #ユーザーモデル 29 create_table "users", force: :cascade do |t| 30 t.string "name" 31 t.string "email" 32 t.string "password_digest" 33 t.datetime "created_at", null: false 34 t.datetime "updated_at", null: false 35 end 36 37end

Ruby

1#user.rb 2class User < ApplicationRecord 3 has_many :posts, dependent: :destroy 4 5 # ↓ バリデーション諸々 ↓ # 6end

Ruby

1#theme.rb 2class Theme < ApplicationRecord 3 has_many :post, dependent: :destroy 4end

Ruby

1#post.rb 2class Post < ApplicationRecord 3 belongs_to :user 4 belongs_to :theme 5 has_many :likes, dependent: :destroy 6 7 #タイトルのバリデーションは不要(自動で挿入予定) 8 9 #コンテントのバリデーション 10 validates :content, length: {maximum: 100} 11 12 #イラストのバリデーション 13 validates :illust, inclusion: { in: %w(jpg jpeg png JPG JPEG PNG), 14 message:"%{value} の拡張子は無効です" } 15 #今後画像サイズのバリデーション 16 17 validates :user_id, presence: true 18 validates :theme_id, presence: true 19 20end

試したこと

SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT ? [["id", 1], ["LIMIT", 1]]についてググりましたが進展はありませんでした。

何気なくSQLを実行してみたところもう少し深い?エラーが出てきたので
SyntaxError: unexpected tCONSTANT, expecting end-of-inputでググりましたが、余り進展はなくとにかくWHEREのところで終わることを期待しているんだなとわかりました。

[10] pry(main)> SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT ? [["id", 1], ["LIMIT", 1]] SyntaxError: unexpected tCONSTANT, expecting end-of-input ...T "users".* FROM "users" WHERE "users"."id" = ? LIMIT ? [[... ... ^~~~~ [10] pry(main)> SELECT "themes".* FROM "themes" WHERE "themes"."id" = ? LIMIT ? [["id", 1], ["LIMIT", 1]] SyntaxError: unexpected tCONSTANT, expecting end-of-input ... "themes".* FROM "themes" WHERE "themes"."id" = ? LIMIT ? [... ... ^~~~~

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

cloud9を使用しております。

Cloud9User:~/environment/Irasta (controller) $ sqlite3 --version 3.7.17 2013-05-20 00:56:22 118a3b35693b134d56ebd780123b7fd6f1497668 Cloud9User:~/environment/Irasta (controller) $ rails -v Rails 5.1.6

自分でももう少し粘ろうと思いますが、目星がございましたらご教授願います。

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

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

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

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

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

guest

回答2

0

自己解決

コメントでお教え頂いたメソッドを使ってエラーメッセージを見てみたところ、イラスト名のバリデーション(post.rb/12行目あたり)でひっかかっておりました。問題のバリデーションをコメントアウトしたところ、データの追加が無事実行できました。

このままではイラストのファイル名としてpngやjpegといったものしか指定できないということですよね。
今後は正規表現を作成しformatにてバリデーションを掛け、正しい拡張子のみ受け取れるようにしていきます。ご協力ありがとうございました。

投稿2020/04/25 01:07

mikichi8

総合スコア0

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

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

0

「少し深いエラー」は、rails console で生SQLを流したからです。
post=Post.create(....)
としてrollbackで終わった後で
post.errors.messages とやるとなぜsaveできなかったかわかります

投稿2020/04/23 08:57

winterboum

総合スコア23347

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

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

mikichi8

2020/04/24 07:39

ご回答・アドバイスありがとうございます やってみます!!
mikichi8

2020/04/25 01:00

イラスト名のバリデーションで引っかかっていたようです。問題のバリデーションをコメントアウトしてみたら問題なくデータの登録が実行出来ました。手助け頂きありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問