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

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

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

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

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Ruby on Rails

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

保存

保存(save)とは、特定のファイルを、ハードディスク等の外部記憶装置に記録する行為を指します。

Q&A

解決済

1回答

2694閲覧

booksテーブルにデータを保存できない。 idがnilになってしまう。

ntk__7__ksn

総合スコア14

Ruby

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

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Ruby on Rails

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

保存

保存(save)とは、特定のファイルを、ハードディスク等の外部記憶装置に記録する行為を指します。

0グッド

0クリップ

投稿2020/08/02 11:52

編集2020/08/02 16:22

#前提・実現したいこと
コンソールで
booksテーブルに name: "book1"price: 1000 と **published_on: Time.parse("20201010").ago(1.months)**を保存したい。
booksテーブルにデータは保存はできないがpublishersテーブルにデータは保存できる。

バージョン
ruby '2.6.6'
'rails', '> 6.0.3', '>= 6.0.3.'
'mysql2', '
> 0.4.2'

#発生している問題、idがnillになってしまう

[12] pry(main)> book = Book.create( [12] pry(main)* name: "Book 1", [12] pry(main)* published_on: Time.parse("20201010").ago(1.months), [12] pry(main)* price: 1000, [12] pry(main)* ) => #<Book:0x00007fb4f3e62e40 id: nil, name: "Book 1", published_on: Thu, 10 Sep 2020, price: 1000, image: nil, created_at: nil, updated_at: nil, publisher_id: nil, sales_status: nil>

⬇︎publishersテーブルは保存出来る⬇︎

1] pry(main)> publisher = Publisher.create( [1] pry(main)* name: "Gihyo inc.", [1] pry(main)* address: "Ichigaya", [1] pry(main)* ) (0.8ms) SET NAMES utf8, @@SESSION.sql_mode = CONCAT(CONCAT(@@sql_mode, ',STRICT_ALL_TABLES'), ',NO_AUTO_VALUE_ON_ZERO'), @@SESSION.sql_auto_is_null = 0, @@SESSION.wait_timeout = 2147483 (11.7ms) BEGIN Publisher Create (54.3ms) INSERT INTO `publishers` (`name`, `address`, `created_at`, `updated_at`) VALUES ('Gihyo inc.', 'Ichigaya', '2020-08-02 10:51:14.216360', '2020-08-02 10:51:14.216360') (3.6ms) COMMIT => #<Publisher:0x00007fa7ef32f868 id: 1, name: "Gihyo inc.", address: "Ichigaya", created_at: Sun, 02 Aug 2020 10:51:14 UTC +00:00, updated_at: Sun, 02 Aug 2020 10:51:14 UTC +00:00>

なんでpublishersテーブルは保存できるの??
#該当のソースコード
どこが該当しているのか分からないのでここかな?というところを載せています。

bookscontroller

1class BooksController < ApplicationController 2 3 def index 4 @books = Book.all 5 end 6end

routes

1Rails.application.routes.draw do 2 resources :books, only: :index 3 resources :publishers 4 resources :profile 5end
class Book < ApplicationRecord enum sales_status: { reservation: 0, # 予約受付中 now_on_sale: 1, # 発売中 end_of_print: 2, # 販売終了 } scope :costly, -> { where("price > ?", 3000) } scope :written_about, ->(theme) { where("name like ?", "%#{theme}%") } belongs_to :publisher, optional: true # 本は出版社名を一つ持っている has_many :book_authors # 本はたくさんの著者が書いている、中間テーブル has_many :authors, through: :book_authors # 著者はたくさんの本を書いている validates :name, presence: true # 空の値は認めない validates :name, length: { maximum: 25 } # 文字数の上限は25 validates :price, numericality: { greater_than_or_equal_to: 0 } # 値段は0以上にしないと認めない end

#自分で調べたこと、エラー文
Book.create!でエラーを調べ下記のエラー文が出ています。

[13] pry(main)> Book.create! ActiveRecord::RecordInvalid: Validation failed: Publisher must exist, Name can't be blank, Price is not a number from /Users/7tk/.rbenv/versions/2.6.6/lib/ruby/gems/2.6.0/gems/activerecord-6.0.3.2/lib/active_record/validations.rb:80:in `raise_validation_error'

ActiveRecord :: RecordInvalid:検証に失敗しました:パブリッシャーが存在している必要があります。名前を空白にすることはできません。価格は数値ではありません

との意味で

[12] pry(main)> book = Book.create( [12] pry(main)* name: "Book 1", [12] pry(main)* published_on: Time.parse("20201010").ago(1.months), [12] pry(main)* price: 1000, [12] pry(main)* )

上記のように書いたのですがどこが間違っているのか分からなかったので、
わかる方がいらっしゃいましたらよろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

Book.createの代わりにBook.create!にすると保存できない場合はエラーになるので分かりやすいかもしれません。

投稿2020/08/02 15:06

asm

総合スコア15149

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

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

ntk__7__ksn

2020/08/02 15:58 編集

コメントありがとうございます。 Book.create!を記入したところエラーが出ました。 そのエラーを検索してoptional: trueを記入すると直るとの事でしたが直したらまた下記のようにエラーが出てしまいました。 > ActiveRecord::RecordInvalid: Validation failed: Publisher must exist, Name can't be blank, Price is not a number パブリッシャーが存在している必要があります。名前を空白にすることはできません。価格は数値ではありません。との意味だったので、下記のように書いたのですがまだnilが出てしまい直せませんでした。 何かわかる事があればよろしくお願いします。 ⬇︎⬇︎⬇︎ 12] pry(main)> book = Book.create( [12] pry(main)* name: "Book 1", [12] pry(main)* published_on: Time.parse("20201010").ago(1.months), [12] pry(main)* price: 1000, [12] pry(main)* ) => #<Book:0x00007fb4f3e62e40 id: nil, name: "Book 1", published_on: Thu, 10 Sep 2020, price: 1000, image: nil, created_at: nil, updated_at: nil, publisher_id: nil, sales_status: nil> [13] pry(main)> Book.create! ActiveRecord::RecordInvalid: Validation failed: Publisher must exist, Name can't be blank, Price is not a number from /Users/7tk/.rbenv/versions/2.6.6/lib/ruby/gems/2.6.0/gems/activerecord-6.0.3.2/lib/active_record/validations.rb:80:in `raise_validation_error'
asm

2020/08/02 20:11

()の引数もcreateの時同様に渡してやってください
ntk__7__ksn

2020/08/03 03:08 編集

すいません同時に渡すとはどういう事でしょうか。 どのような書き方になるのでしょうか。
asm

2020/08/03 03:21

同様(どうよう) [12] pry(main)> book = Book.create!( [12] pry(main)* name: "Book 1", [12] pry(main)* published_on: Time.parse("20201010").ago(1.months), [12] pry(main)* price: 1000, [12] pry(main)* ) ですね
ntk__7__ksn

2020/08/03 03:50 編集

すいません、読み間違えました。恥ずかしい。 asmさんデータを保存する事ができました。 とても助かりました!!! ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問