0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

rails チェックボックスを使用した、各設問複数回答可能な診断機能の実装

Posted at

1.はじめに

こんにちは!Webコースでメンターをしていますさとこーです!今回は質問回答をラジオボタン式 → チェックボックス式に変更し、各設問複数回答可能な診断機能を作成してみました!診断方法の幅が広がるので是非チャレンジ、アレンジしてみてください!!

なお、本記事は https://qiita.com/takeru55555/items/bed00ed822e0a49de291 を参照して作成しています。モデル、コントローラー設計等はコチラの記事を参考にしてください。

controllerの記述

perfumes_contoller.rb
class PerfumesController < ApplicationController
    def new
        @perfume = Perfume.new
    end

    def show
        @perfume = Perfume.find_by(id: params[:id])
        calculate_diagnosis
    end

    def create
        @perfume = Perfume.new(perfume_params)
        if @perfume.save
        flash[:notice] = "診断が完了しました"
        redirect_to perfume_path(@perfume.id)
        else
        render :new
        end
    end

    private

    def perfume_params
        params.require(:perfume).permit({ question1: [] }, { question2: [] }, { question3: [] })
    end

    def calculate_diagnosis
        counts = { 視覚型: 0, 聴覚型: 0, 運動感覚型: 0 }

        counts[:視覚型] += @perfume.question1&.count || 0
        counts[:聴覚型] += @perfume.question2&.count || 0
        counts[:運動感覚型] += @perfume.question3&.count || 0

        @dominant_type = counts.max_by { |_, v| v }[0]
    end
end

モデルの記述

perfume.erb
class Perfume < ApplicationRecord
    serialize :question1, Array
    serialize :question2, Array
    serialize :question3, Array
end

質問ページの記述

new.html.erb
<%= form_for(@perfume, class: 'form-horizontal', role: 'form') do |f| %>
    <div class="perfume-container">
        <!-- 質問1: 視覚 -->
        <div class="col-12">
            <p>Q1. 視覚</p>
        </div>
        <div class="col-6">
            <%= f.check_box :question1, { multiple: true, id: "custom_id1", value: "1" } %>
            <label for="custom_id1">メモをたくさん取る</label>
            <%= f.check_box :question1, { multiple: true, id: "custom_id2", value: "2" } %>
            <label for="custom_id2">メモは取るが、メモを確認している様子はない</label>
            <%= f.check_box :question1, { multiple: true, id: "custom_id3", value: "3" } %>
            <label for="custom_id3">学習者が話すとき、自分を見て話す</label>
            <%= f.check_box :question1, { multiple: true, id: "custom_id4", value: "4" } %>
            <label for="custom_id4">何かバッグにノイズがあると集中していない様子である</label>
        </div>
        
        <!-- 質問2: 聴覚 -->
        <div class="col-12">
            <p>Q2. 聴覚</p>
        </div>
        <div class="col-6">
            <%= f.check_box :question2, { multiple: true, id: "custom_id5", value: "1" } %>
            <label for="custom_id5">メモをあまりとらない</label>
            <%= f.check_box :question2, { multiple: true, id: "custom_id6", value: "2" } %>
            <label for="custom_id6">ものを書くときに独り言を言っている</label>
            <%= f.check_box :question2, { multiple: true, id: "custom_id7", value: "3" } %>
            <label for="custom_id7">指示を与えたときその指示を復唱する</label>
            <%= f.check_box :question2, { multiple: true, id: "custom_id8", value: "4" } %>
            <label for="custom_id8">サラっといったことをよく覚えている</label>
        </div>
        
        <!-- 質問3: 運動感覚 -->
        <div class="col-12">
            <p>Q3. 運動感覚</p>
        </div>
        <div class="col-6">
            <%= f.check_box :question3, { multiple: true, id: "custom_id9", value: "1" } %>
            <label for="custom_id9">説明をすると見本を実際見たいという</label>
            <%= f.check_box :question3, { multiple: true, id: "custom_id10", value: "2" } %>
            <label for="custom_id10">音楽など音があっても集中している様子である</label>
            <%= f.check_box :question3, { multiple: true, id: "custom_id11", value: "3" } %>
            <label for="custom_id11">自分のやり方でやろうとする</label>
            <%= f.check_box :question3, { multiple: true, id: "custom_id12", value: "4" } %>
            <label for="custom_id12">長時間座席についていると落ち着かない様子で、立ち上がる回数が多い</label>
        </div>
    </div>
    <div class="sindanbotan">
        <%= f.submit " 結果 " %>
    </div>
<% end %>

診断結果ページの記述

new.html.erb
<div class="intoro">
  <h5>診断結果</h5>
  <p>あなたにおすすめの診断結果は…</p>
</div>
<div class="perfume-container">
  <% if @dominant_type.present? %>
    <% case @dominant_type %>
    <% when :視覚型 %>
      <h3>視覚型タイプ</h3>
      <p>ここには何か自由に記述入れよう※任意</p>
    <% when :聴覚型タイプ %>
      <h3>あなたは聴覚型です</h3>
      <p>ここには何か自由に記述入れよう※任意</p>
    <% when :運動感覚型タイプ %>
      <h3>あなたは運動感覚型です</h3>
      <p>ここには何か自由に記述入れよう※任意</p>
    <% end %>
  <% else %>
    <p>診断結果が見つかりませんでした。もう一度試してください。</p>
  <% end %>
</div>
以上で完了です!controller, viewsを変更して自分なりの診断機能を作ってみてください!

おわりに

大学生限定プログラミングコミュニティのGeekSalonでメンターをしてます!
大学生でプログラミング気になる人はぜひHP見てみてね:yellow_heart:
要チェック!大学生限定プログラミングコミュニティGeekSalon

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?