Rail enumで2択のデータを保存する方法(integer型)


 概要

こんにちは。
個人アプリの作成過程でラジオボタンで2択のデータを保存する機能を実装したので、残しておきます。
今回はMaterializeを使用しています。

こんな感じです。

手順

  • integer型でカラムを作成
  • モデルにenumを記述
  • view側に記述

integer型でカラムを作成

ポートフォリオでカフェを投稿するアプリを作成したので今回は

wifiカラムをinteger型で作成します。

add_columnn.rb
  def change
    add_column :shops, :wifi, :integer
  end

モデルにenumを記述

shop.rb
  enum wifi: { yes: 1, no: 2 }

コンソールでは

pry(main)> @shop.wifi = 1
=> 1
pry(main)> @shop.wifi
=> "yes"

このようにenumに設定したvalueが出力されます。

viewに記述

form_forでラジオボタンからデータを送ります。

<%= form_for(@shop) do |f| %>
  <%= f.radio_button :wifi, :yes %> # チェックすると1が入る
  <%= f.radio_button :wifi, :no %> # チェックすると2が入る
<% end %>

私はmateriarizeで実装したのでこんな感じになりました。

<%= form_for(@shop) do |f| %>
  <div class="col s12 radio_col">
    <label>
      <span class="list">Wifi</span>
      <i class="material-icons small">wifi</i>
      <%= f.radio_button :wifi, :yes, class: "with-gap"%>
      <span></span>
    </label>
    <label>
      <%= f.radio_button :wifi, :no, class: "with-gap"%>
      <span></span>
    </label>
  </div>
<% end %>

表示は

<% @shop.wifi %>
valueが1なら
"yes"
valueが2なら
"no"
と表示される

if文では

<% if shop.wifi == "yes" %>

と書く
== 1ではfalseになってしまいました。

また,enum時点で文字列でも設定できるみたいです!

次回はJqueryで選択解除する方法をあげたいとおもいます!