わかったつもりになってない?

わかったつもり防止のために、日常で学んだことをもう少し深堀したいブログ

【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」という配列に、「マリオ」「ゼルダ」「カービィ」とそれに対応するチェック状況が格納されます。


f:id:gattsu09:20180621000441p:plain


上記状態だと、以下のように、それぞれのタイトルに対しチェック無しの場合は「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の内容を表示させるなりしてください。

参考にしたサイト

ナレッジをアウトプットしてくれる方がいるから前に進めます。感謝。

kiyorin-net.blogspot.com