【Ruby on Rails】Checkboxの値を配列としてコントローラに渡し、チェックがついている値だけDBに保存する方法
ども。最近、趣味で毎晩Ruby on Railsで遊んでいます。twitterの100日間なにかしらコード書いていこうぜっていう趣旨の#100DaysofCodeという企画に乗っかってて、なんとか100日間継続してやっていきたい感じです。んで、本日は6日目になるのですが、振り返りも大事だろうということで、直近で学んだことをまとめておきたいと思います。
なお、この記事は最初にこの記事を知ってればもっと楽だったのにな…という観点で3日前の僕(progateのRuby on Railsを一周したレベル)を想定読者として書いています。
Checkboxのチェックがついている値だけを取得する
というわけで、記事タイトルで書いてますが、Cehckboxのリストに対し、チェックがついている値だけをDBに保存する方法について書いていきます。
Checkboxの値を配列に格納する
では、早速ですがCheckboxの値を配列に格納していきます。Ruby on Railsでチェックボックスを使う場合、check_boxというタグを使います。(ほかにもcheck_box_tagというのもありますが、ここでは説明を割愛します。)
check_boxの書式は以下の通りです。他オプションとか詳しいことはrailsドキュメントとかを見てください。
<%= check_box "オブジェクト名","プロパティ名" %>表示名
んで、オブジェクト名に指定した文字列へ、二次元配列として「"プロパティ名"、"チェック状況(0 or 1)"」が格納されます。具体例として、以下のように記述すれば…
<%= form_tag("/posts/like") do %> <ul> <li><%= check_box "gamelist", "マリオ" %>マリオ</li> <li><%= check_box "gamelist", "ゼルダ" %>ゼルダ</li> <li><%= check_box "gamelist", "カービィ" %>カービィ</li> </ul> <input type="submit" value="投稿"> <% end %>
「gamelist」という配列に、「マリオ」「ゼルダ」「カービィ」とそれに対応するチェック状況が格納されます。
上記状態だと、以下のように、それぞれのタイトルに対しチェック無しの場合は「0」、有りの場合は「1」が二次元配列に格納されます。
<gemelist配列内容>
マリオ,0
ゼルダ,1
カービィ,0
コントローラでチェックがついている値だけDBに格納
後は、form_tagで定義している/posts/likeeに対するコントローラファイルを以下の通りに定義し、チェックがついている値だけを取り出します。(ルールファイルの定義は適切にされているものとします。)
def like # params:[gamelist]で配列の値を取得可能。 # 二次元配列の場合、受取先の変数を2つ宣言する。下記例では、 # di1がタイトル、di2がチェックボックスの状態(0 or 1)が格納される。 params[:gamelist].each do | di1,di2 | # チェックボックスにチェックがついている場合 if di2 == "1" # DBのtitleカラムにタイトルを格納し保存 @get_game = GetGame.new(title:di1) @get_game.save end end redirect_to("/posts/index") end
あとは、適時redirect_to先のページで、DBの内容を表示させるなりしてください。