LoginSignup
9
9

More than 3 years have passed since last update.

ちゃんとフォームに名前入れたのに、Mysql2::Error: Field 'nickname' doesn't have a default value: INSERT INTO 言われた

Last updated at Posted at 2019-12-10

前置き

deviseを導入して、rails g devise:installで設定ファイルをrailsアプリケーションに作成。

ターミナル
rails g devise:install

その後rails g devise userでdeviseのuserモデルを作成。

ターミナル
rails g devise user

これでuser.rbやマイグレーションファイルなどができるので、nicknameカラムをnull: falseで追加。そしてrake db:migrate。

XXXXXXXXXXXXX_devise_create_users.rb
t.string :nickname, null: false

ターミナル
rake db:migrate

元々emailカラムとencrypted_passwordカラムが入ったdeviseのuserテーブルにnicknameカラムの入ったものが出来上がったので次に移る。

rails g devise:viewsでdeviseのviewを作成した後に、下記のようにnicknameのフォームを追加して、名前、email、パスワードをテーブルに新規登録するするフォームが出来上がった。

ターミナル
rails g devise:views
new.html.erb
<div class="field">
    <%= f.label :nickname %><br />
    <%= f.text_field :nickname, autofocus: true %>
</div>

ここから本題

前置きが長くなってしまったけれど、詰まったところはここから。
全てのフォームに情報を入力し、signupを押すと、、
Field 'nickname' doesn't have a default valueというエラーに。

※エラー画像はうまく画像が表示されないので割愛。

原因

調べたら、nicknameが空だと言っていると判明。
ちゃんとデータとんでいるのになんで?
と思って調べたら、deviseのコントローラはデフォルトで入っているemailとパスワードのみを受け取るストロングパラメータが設定されているらしい。。ので、

application_controller
class ApplicationController < ActionController::Base
  protect_from_forgery with: :exception
  before_action :configre_permitted_parameters, if: :devise_controller?

  def configre_permitted_parameters
    devise_parameter_sanitizer.permit(:sign_up, keys: [:nickname])
  end
end

これでなんとかエラーは解消。usersテーブルにもデータ入ってるのを確認。

まとめ

前半、書くこと忘れてdeviseの導入手順みたいになってしまったけど、必要なところは本題だけかなと。エラー画像Gyazo使って載せようとしたけれどなぜか載せれず。それを調べる気力がなくなってしまったので寝

9
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
9