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

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

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

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

Ruby on Rails

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

Q&A

解決済

2回答

1489閲覧

ActiveRecord::NotNullViolationがなぜ表示されるのか分からない

mayok

総合スコア12

Ruby

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

Ruby on Rails

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

0グッド

0クリップ

投稿2020/01/11 14:06

前提・実現したいこと

マイクロポストを昇順に取り出せるようコードを書いています。

ご教授いただきたいのは'NotNullViolation'エラーがなぜ表示されているのかです。
以下のエラーメッセージの他に同じ内容で52件のエラーが表示されています。
考えてみた結果仮説を立てたのですが私の認識は合っていますでしょうか?

「microposts.user_idがNOT NULL制約により失敗したとあるので以下に添付するfixtureファイル内でuserのIDが無いことが原因。」

お手数ですがよろしくお願いします。

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

ERROR["test_should_not_allow_the_admin_attribute_to_be_edited_via_the_web", #<Minitest::Reporters::Suite:0x0000000006353e68 @name="UsersControllerTest">, 3.895290147999731] test_should_not_allow_the_admin_attribute_to_be_edited_via_the_web#UsersControllerTest (3.90s) ActiveRecord::NotNullViolation: ActiveRecord::NotNullViolation: RuntimeError: NOT NULL constraint failed: microposts.user_id

該当のソースコード

(micropost_test.rb) require 'test_helper' class MicropostTest < ActiveSupport::TestCase def setup @user = users(:michael) #userに紐付いた新しいmicropostオブジェクトを返す @micropost = @user.microposts.build(content: "Lorem ipsum") end #作成したマイクロポストが有効か確認 test "should be valid" do assert @micropost.valid? end #マイクロポストがuser_idを持つか確認 test "user id should be present" do @micropost.user_id = nil assert_not @micropost.valid? end test "content should be present " do @micropost.content = " " assert_not @micropost.valid? end test "content should be at most 140 characters " do @micropost.content = "a" * 141 assert_not @micropost.valid? end test "order should be most recent first" do assert_equal microposts(:most_recent), Micropost.first end end
(test/fixtures/microposts.yml) orange: content: "I just ate an orange!" created_at: <%= 10.minutes.ago %> tau_manifesto: content: "Check out the @tauday site by @mhartl: http://tauday.com" created_at: <%= 3.years.ago %> cat_video: content: "Sad cats are sad: http://youtu.be/PKffm2uI4dk" created_at: <%= 2.hours.ago %> most_recent: content: "Writing a short test" created_at: <%= Time.zone.now %>
(micropost.rb) class Micropost < ApplicationRecord belongs_to :user #投稿をdescending(降順)にする default_scope -> { order(created_at: :desc) } #descをシンボルにする validates :user_id, presence: true validates :content, presence: true, length: { maximum: 140 } end

試したこと

①タイポが無いかの確認。
②ActiveRecord::NotNullViolationのエラーは初めてだったので検索。
検索の結果Django使用時の同エラーを解決する記事はteratailやstack overflowにて複数読んだのですが、rails使用時の解決を示すページは見つからなかったため質問させていただきました。

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

macOS catalina10.15.2
ruby 2.6.3
rails 6.0.1

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

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

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

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

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

guest

回答2

0

ベストアンサー

ご自身の認識であっていると思います。
エラーメッセージを読んで、原因を探り、対策できているので良いと思います。 ????

投稿2020/01/11 15:16

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

mayok

2020/01/12 05:17

ご回答ありがとうございます。 自信になる言葉をいただけてとても嬉しいです。さらに勉強を続けていきます!
guest

0

fixtureにuser_idが無いことが原因だと考えたため、microposts.ymlにuser_idをそれぞれ追加したところ
エラーメッセージが消えました。

52 tests, 222 assertions, 0 failures, 0 errors, 0 skips

あまりにも理解が浅いため再現性がないデバッグ(と言えるかは不安ですが)になってしまったので、
引き続きご回答を受け付けたいと思います。

よろしくお願いします。

投稿2020/01/11 15:12

mayok

総合スコア12

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問