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


前置き

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使って載せようとしたけれどなぜか載せれず。それを調べる気力がなくなってしまったので寝