多階層セレクトボックス作ってた時の独り言
ajax通信でコントローラーに飛ぶ時にbeforeアクションでexceptに入れてないとそいつにも値をセットしようとするけどそんなんないって言われることある。
あとancestryのフォーム作る時みんなカラム名どうしてんだろ?
自分は孫までのセレクトボックスが次々現れるようなの書いたんだが、孫のidを外部キーとしてitemsテーブルに登録したかった。
最初の親のフォームにf.select :category_idってしちゃうと親の値が入っちゃうから駄目だったので親にはtext型でvalueに親のnameをそのまま入れたf.select :parentcategoryって感じのフォーム作った。
子にはinteger型で子のidをvalueに入れたoptionタグを、nameにitem[childcategory]って入れたselectタグで囲む形のフォームを組み立ててappendした。itemっていうのはcategory_id持ちたいテーブルがitemsで今@itemのform_for内だったからそうなってる。
孫は基本的に子と同じでselectタグのnameを(ここでようやく)item[category_id]にして,オプションタグのvalueは孫のidが入るようなhtmlを組み立てる、って感じでやった。
流れ自体はネットにあった記事を参考にしたんだが、フォーム部分でエラーになった。フォームの部分はそれぞれカラム作ってやらないと駄目なんだろうか?最初は孫だけ登録しようと思ったんだが、自分が作った物は親と子のセレクトボックスの段階でエラーが起きないようにこの二つにもカラムを作ってあげる形で実装した。まぁ、親の名前だけ欲しい時もあるからあってもそんなに困りはしないか。
参考記事
https://qiita.com/ATORA1992/items/bd824f5097caeee09678
ちなみに途中でf.selectの記述がわかりづらい場合はこっち参照
{}をわざわざ記述してるのは、idやclassの記述が動作オプションと間違われないようにするため
https://www.task-notes.com/entry/20161224/1482548161
form_forブロック下のselectやcollection_selectの書き方や、配列の時とハッシュの時なんかが書いてあるのでselect関係で忘れたらとりあえず確認すると良い
pluckは今回は直接は関係ないけど(コントローラー側で配列作ってたから)