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

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

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

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

Ruby

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

MySQL

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

Ruby on Rails

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

Q&A

解決済

2回答

2130閲覧

ActiveRecord::NotNullViolation が突破できません。

take77

総合スコア130

Ruby on Rails 5

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

Ruby

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

MySQL

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

Ruby on Rails

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

0グッド

0クリップ

投稿2019/08/21 08:32

編集2019/08/21 10:49

前提・実現したいこと

Ruby on Railsでアプリケーションを作っています。
その中で、avatarを設定する箇所を作っているのですが、そこでエラーが発生してしまいます。
avatarは設定してもしなくてもよいようにしたいので、設定を必須にする形にはできません。

なにとぞご助力を願いたく思います。

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

ActiveRecord::NotNullViolation (Mysql2::Error: Column 'avatar' cannot be null: INSERT INTO `accounts` (`nickname`, `avatar`, `user_id`, `created_at`, `updated_at`) VALUES ('nickname', NULL, 1, '2019-08-21 08:09:56', '2019-08-21 08:09:56')):

該当のソースコード

migration

1class CreateAccounts < ActiveRecord::Migration[5.2] 2 def change 3 create_table :accounts do |t| 4 t.string :nickname, null: false, default: "" 5 t.string :avatar, null: false, default: "" 6 t.references :user, foreign_key: true 7 8 t.timestamps 9 end 10 end 11end

create

1 def create 2 @account = Account.new(create_params) 3 @account.user = current_user 4 binding.pry 5 unless @account.save 6 redirect_back(fallback_location: root_path) 7 end 8 end

binding

1# 上記binding.pry時 2[1] pry(#<AccountsController>)> @account 3=> #<Account:0x00007f5121f32310 4 id: nil, 5 nickname: "nickname", 6 avatar: "", 7 user_id: 1, 8 created_at: nil, 9 updated_at: nil> 10

INSERT

1 Account Create (1.1ms) INSERT INTO `accounts` (`nickname`, `avatar`, `user_id`, `created_at`, `updated_at`) VALUES ('nickname', NULL, 1, '2019-08-21 08:09:56', '2019-08-21 08:09:56')

試したこと

migrationファイルのnull: falsedefault: ""の順番の入れ替えや、上記掲載情報の確認などはてみましたが、上記以外のエラーは確認できませんでした。

…defaultを空文字に設定している時には、INSERTがNULLでもカラムには空文字が入ると考えていたのですが、その認識が間違っているのでしょうか?
別のアプリケーションでは同じようなやり方で動いていたのですが…。

ご指導のほど、よろしくお願いします。

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

ruby: 2.6.3
rails: 5.2.3
mysql2: 0.5.2
gem: carrierwave (追記)

追記

モデルの内容は以下の通りです。

account

このカラムではcarrierwaveを利用しているんですが、これが悪さをしているのでしょうか?

binding

1[4] pry(#<AccountsController>)> @account.avatar 2=> #<AvatarUploader:0x00007f6892de3710 3 @cache_id=nil, 4 @file=nil, 5 @filename=nil, 6 @identifier=nil, 7 @model= 8 #<Account:0x00007f68935e8190 9 id: nil, 10 nickname: "nickname", 11 avatar: "", 12 user_id: 1, 13 created_at: nil, 14 updated_at: nil>, 15 @mounted_as=:avatar, 16 @staged=false, 17 @versions=nil> 18[5] pry(#<AccountsController>)> @account.avatar.blank? 19=> true 20[6] pry(#<AccountsController>)> @account.avatar.nil? 21=> false

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

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

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

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

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

winterboum

2019/08/21 10:26

奇妙 models/account.rb を見せて下さい
take77

2019/08/21 10:51

コメントありがとうございます。 ご指摘に従い、modelの情報を追加しました。 また、carrierwaveを使っていることが原因かもしれないと考え、情報を追加しました。 必要な情報などありましたらどんどんご指摘いただきたいです。 よろしくお願いします。
guest

回答2

0

ベストアンサー

ああ、やはりcarrierwave使ってましたね。
きちんと調べてはいませんが、carrierwaveがnilにしているのだと思います。
DBにNULLがない方がよい、というのは 私はあまり気にしていません。

orderを掛けたり、大小比較するような項目のときに、nullがあるかもしれないという気遣いは必要になりますが。

carrierwaveがnilにしているのだとすると、その項目は諦めて null は許すようにしてはどうでしょう

投稿2019/08/21 13:31

winterboum

総合スコア23324

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

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

take77

2019/08/21 13:49

コメントありがとうございます。 > orderを掛けたり、大小比較するような項目のときに、nullがあるかもしれないという気遣いは必要になりますが。 なるほど、nullが危険になるのはこういうタイミングなのですね。 では、今回はあきらめてこちらのみnullを許容する形で実装しようと思います。 万が一これが原因でエラーが出るようなことがあれば、またこちらを頼ります。 ありがとうございました。 勉強になりました。
no1knows

2019/08/22 00:25

carrierwaveでnilになるとは勉強になりました。 調べたところ、「form_tag, のなかに → multipart: :true」でnil問題を回避できるようです。 https://qiita.com/leopard/items/246f03059f99f0e03a32 「carrierwave null」で検索してみるといいかもしれません。
guest

0

下記のようにavatarというカラムにnullで入力できない(null: false)ように設定しているのでMySQLでエラーが出ているのかと思います。
null: falseを削除すると期待通りの動作になるかと思います。

migration

1 2t.string :avatar, null: false, default: ""

投稿2019/08/21 10:57

no1knows

総合スコア3365

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

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

take77

2019/08/21 11:30

回答ありがとうございます。 ただ、`null: false`を削除してしまうとカラムにデータがない時、`NULL`が入ってしまいます…。 基本的にNULLはデータベースレベルでのエラーを招くため、極力避けたほうが良いと聞いたのですが、そのあたりはいかがでしょうか? できればこの記述自体は残したいので…。 差し出がましいかもしれませんが、よろしくお願いします。
take77

2019/08/21 13:51

結局、no1knowsさんご指摘の指摘にて実装させていただくことにしました。 ベストアンサーに選びたかったのですが、nullの扱いについての情報も加味してwinterboumさんの回答をベストアンサーとさせていただきました。 ご回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問