未踏作業日誌――余計なもの作るよ!

未踏の作業日誌的なものを書きましょうということで書くことにしました.余計なことばっかりしています.

Mysql2::Error: Field 'hoge' doesn't have a default valueが出た時の対処法

scaffoldでMVCの3つを自動生成した後に,例えばマイグレーションのcreate_tableなんかで勝手にモデルのカラムを増やしてしまったとか.基本的に,Railsは色々なところで相互に関連し合っている複雑なフレームワークなので,例えば一箇所だけrailsコマンドを使わずに変更したりすると平気で動かなくなってしまう.

表題のエラーが発生すると,MySQLに投げられるクエリが表示される.でも,何度見ても代入されていない感じがする.INTO VALUESにhogeの値が入っててもいいのに,なぜだか存在しない.

 

解決方法は至って簡単で,自動生成されたコントローラにはpost_paramsと呼ばれるメソッドが自動的に生成される.

gist9122690

post_paramsというメソッドは,デフォルトではnewアクションもしくはupdateアクションで利用されている.post_paramsが返す値はハッシュ型のインスタンスで,モデルをnewもしくは,updateメソッドの引数に渡してあげると,ちゃんとモデルのインスタンスが生成される仕組みになっている.

post_paramsの中では,params.require(モデル名).permit(カラム名)というコードだけが書かれている.カラム名のところでフォームから受け取るパラメータを指定する.恐らく,フレームワークのモデルに対するインジェクションを防ぐ意味があるのだろう.

カラム名の指定がないことで,自動的にnilが代入されるため,not nullなカラムやデフォルトのないカラムがあった場合,表題のようなエラーが出るようになる.

対処法としては簡単で,post_paramsのところでカラム名を追加してあげればいい.これで,フォームからの入力をコントローラを経由してモデルに渡すことができるようになる.