前提・実現したいこと
railsで所定のフォーマットにしたがって報告を行うようなアプリケーションを作っています。
今はラジオボタンを使って「はい/いいえ」を答えさせる部分をform_withヘルパーを使って実装しています。
発生している問題・エラーメッセージ
form_withメソッドを使ったラジオボタンを作成することはできましたが、
MySQL上のレコードにうまく値が保存できません。
具体的には、「いいえ」のボタンをチェックして送信した時にはfalseとなるようにしていますが、
MySQL上では「はい/いいえ」どちらを選んでも「1」が入っています。
※これはMySQL上でTrueを示していると理解しています。
※マイグレーション時にはdefault: trueを設定しています。
該当のソースコード
マイグレーション
ruby
1class CreateReports < ActiveRecord::Migration[6.0] 2 def change 3 create_table :reports do |t| 4 t.references :user, foreign_key: true 5 t.references :room, foreign_key: true 6 t.time :study_time, null: false 7 t.time :concentrated_time, null: false 8 t.text :good_way, null: false 9 #問題はこのachieved?です 10 t.boolean :achieved?, default: true, null: false 11 t.text :go_wrong 12 t.text :tomorrow_plan, null: false 13 t.text :study_content, null: false 14 t.text :advice, null: false 15 t.timestamps 16 end 17 end 18end
モデル
ruby
1class Report < ApplicationRecord 2 belongs_to :user 3 belongs_to :room 4 with_options presence: true do 5 validates :study_time 6 validates :concentrated_time 7 validates :good_way 8 validates :tomorrow_plan 9 validates :study_content 10 validates :advice 11 end 12 validates :achieved?, inclusion: { in: [true, false] } 13 validates :go_wrong, presence: true, unless: :achieved? 14end 15
ビュー
html
1<%= render "shared/header"%> 2 3<div class="registration-body"> 4 <%= form_with model: [@room, @report], url: room_reports_path, class: 'registration-main', local: true do |f| %> 5 <div class='form-wrap'> 6 <div class='form-header'> 7 <h1 class='form-header-text'> 8 学習報告を入力 9 </h1> 10 </div> 11 12 <%= render 'shared/error_messages', model: f.object %> 13 14 <div class="form-group-wide"> 15 <div class='form-text-wrap'> 16 <%= f.label :study_time, "本日の学習時間を入力してください", class:"form-text" %> 17 <span class="indispensable">必須</span> 18 </div> 19 <%= f.time_field :study_time, class:"time-selector"%> 20 </div> 21 <div class="form-group-wide"> 22 <div class='form-text-wrap'> 23 <%= f.label :concentrated_time, "集中して学習を行えた時間を入力してください", class:"form-text" %> 24 <span class="indispensable">必須</span> 25 </div> 26 <%= f.time_field :concentrated_time, class:"time-selector" %> 27 </div> 28 <div class="form-group-wide"> 29 <div class='form-text-wrap'> 30 <%= f.label :good_way, "本日用いた学習方略のうち、特によかったものとその理由を入力してください", class:"form-text" %> 31 <span class="indispensable">※140字まで</span> 32 </div> 33 <%= f.text_area :good_way, class:"input-introduction", placeholder:"例)20分勉強し、5分間で自分の言葉でまとめ、5分間休憩のサイクル(ポモドーロ勉強法)で勉強した。", maxlength:"140" %> 34 </div> 35 <div class="form-group-wide"> 36 <div class='form-text-wrap'> 37 <%= f.label :achieved?, "目標通りに学習を進めることができましたか?", class:"form-text" %> 38 </div> 39 <!--ここが問題のラジオボタンのビューです--> 40 <div class = "radio-button"> 41 <%= f.radio_button :achieved?, true %> 42 <%= f.label :achieved?, 'はい', value: true %> 43 </div> 44 <div class = "radio-button"> 45 <%= f.radio_button :achieved?, false %> 46 <%= f.label :achieved?, 'いいえ', value: false %> 47 </div> 48 </div> 49 <div class="form-group-wide"> 50 <div class='form-text-wrap'> 51 <%= f.label :go_wrong, "(いいえの方に質問)なぜ目標通りに進められなかったのか理由を入力してください", class:"form-text" %> 52 <span class="indispensable">※140字まで</span> 53 </div> 54 <%= f.text_area :go_wrong, class:"input-introduction", placeholder:"例)教材の内容が理解できなかった。", maxlength:"140" %> 55 </div> 56 <div class="form-group-wide"> 57 <div class='form-text-wrap'> 58 <%= f.label :tomorrow_plan, "明日何をどれくらい学習するか計画を立てましょう", class:"form-text" %> 59 <span class="indispensable">※140字まで</span> 60 </div> 61 <%= f.text_area :tomorrow_plan, class:"input-introduction", placeholder:"例)railsを用いたアプリケーションの投稿機能を完成させる。(3時間程度)", maxlength:"140" %> 62 </div> 63 <div class="form-group-wide"> 64 <div class='form-text-wrap'> 65 <%= f.label :study_content, "本日学習した内容や知識を端的にまとめてください", class:"form-text" %> 66 </div> 67 <%= f.text_area :study_content, class:"input-contents", placeholder:"例)form_withはrailsで情報を送信するためのヘルパーメソッドである。" %> 68 </div> 69 <div class="form-group-wide"> 70 <div class='form-text-wrap'> 71 <%= f.label :advice, "メンバーに向けて、オススメの学習方略や新たにえた知識を共有しましょう", class:"form-text" %> 72 <span class="indispensable">※140字まで</span> 73 </div> 74 <%= f.text_area :advice, class:"input-introduction", placeholder:"例)メリハリをつけることが大事ですね。", maxlength:"140" %> 75 </div> 76 <div class='register-btn'> 77 <%= f.submit "送信" ,class:"register-link" %> 78 </div> 79 </div> 80 <% end %> 81</div> 82<%= render "shared/footer"%> 83
####コントローラー
ruby
1class ReportsController < ApplicationController 2 def index 3 @room = Room.find(params[:room_id]) 4 @reports = @room.reports.includes(:user).order(created_at: 'DESC') 5 end 6 def new 7 @report = Report.new 8 end 9 def create 10 @room = Room.find(params[:room_id]) 11 @report = @room.reports.new(report_params) 12 unless @report.save 13 render :new 14 end 15 end 16 17 private 18 19 def report_params 20 params.require(:report).permit(:study_time, :concentrated_time, :good_way, :achieved?, :go_wrong, :tomorrow_plan, :study_content, :advice).merge(user_id: current_user.id) 21 end 22end 23
試したこと
パラメータとしてきちんと値が送られてないのではないか?と考え、
コントローラーのsave
の前でbinding.pry
にて一時停止し確認しました。
結果としては「いいえ」ボタンを選んだときはfalseが送られていました。
しかしその後ターミナル上で@report.save
を行ってから@report.achieved?
を確認してみると、値がtrueになっていました。
# ターミナル 9: def create 10: @room = Room.find(params[:room_id]) 11: @report = @room.reports.new(report_params) => 12: binding.pry 13: unless @report.save 14: render :new 15: end 16: end [1] pry(#<ReportsController>)> params => <ActionController::Parameters {"authenticity_token"=>"1E+0NXjBqd4/g55LINyGeyROvUVlrvJcKr1h0S7B3pi91/MmA4NE/GEwBSq4lIosR5FPxf1fB27zCPSIJkb2Pw==", "report"=><ActionController::Parameters {"study_time"=>"03:00", "concentrated_time"=>"02:00", "good_way"=>"te", "achieved"=>"false", "go_wrong"=>"te", "tomorrow_plan"=>"te", "study_content"=>"te", "advice"=>"te"} permitted: false>, "commit"=>"送信", "controller"=>"reports", "action"=>"create", "room_id"=>"18"} permitted: false> [2] pry(#<ReportsController>)> @report.save (0.2ms) BEGIN ↳ (pry):2:in `create' User Load (0.4ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 1 LIMIT 1 ↳ (pry):2:in `create' Report Create (2.1ms) INSERT INTO `reports` (`user_id`, `room_id`, `study_time`, `concentrated_time`, `good_way`, `go_wrong`, `tomorrow_plan`, `study_content`, `advice`, `created_at`, `updated_at`) VALUES (1, 18, '03:00:00', '02:00:00', 'te', 'te', 'te', 'te', 'te', '2021-01-13 13:06:38.629827', '2021-01-13 13:06:38.629827') ↳ (pry):2:in `create' (1.4ms) COMMIT ↳ (pry):2:in `create' => true [3] pry(#<ReportsController>)> @report.achieved? => true
よってデータをsaveする段階で何かしら問題があり、falseを送れなくなっているのではないかと考えますが、その先がわかりません、、
補足情報(FW/ツールのバージョンなど)
- Ruby: 2.6.5
- Rails: 6.0.3.4
- MySQL: 5.6.50
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/01/14 08:39
退会済みユーザー
2021/01/14 09:01
2021/01/14 10:25
退会済みユーザー
2021/01/15 00:52