質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

ラジオボタン

ラジオボタンはフォームに使われる要素のひとつであり、ユーザに限られた選択肢からひとつの答えを選んでもらうというものです。

Q&A

解決済

1回答

1761閲覧

boolean型データの保存時に初期値に戻されてしまう

lyon

総合スコア5

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

ラジオボタン

ラジオボタンはフォームに使われる要素のひとつであり、ユーザに限られた選択肢からひとつの答えを選んでもらうというものです。

0グッド

0クリップ

投稿2021/01/13 13:10

編集2021/01/13 13:11

前提・実現したいこと

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

achieved? がおかしいです。achieved の間違いでは?

投稿2021/01/13 14:08

winterboum

総合スコア23401

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

lyon

2021/01/14 08:39

変数名に?をつけると正常にパラメータが送られないのですね、、 ご指摘の通り変更を行うことで正常にデータが保存されました。ありがとうございます。
退会済みユーザー

退会済みユーザー

2021/01/14 09:01

なんで ? をつけるとNGなのか、ググっても出てこないですね・・・気持ち悪い・・・。
winterboum

2021/01/14 10:25

?はmethodや変数に使える文字なので、`achieved?`という名前のものと解釈されます。それは`achieved`とは別物なので。。。
退会済みユーザー

退会済みユーザー

2021/01/15 00:52

おお、納得です!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問