🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Ruby on Rails 6

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

Q&A

解決済

1回答

579閲覧

create後にDBにデータが保存されない

pico0120

総合スコア2

Ruby on Rails 6

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

0グッド

0クリップ

投稿2020/11/24 09:39

ある数値(ここでは測定値としています)、測定日、測定した時間帯の3つのデータを投稿画面から入力し保存するという、簡単な機能を実装していますが、createができず悩んでおります。
入力後、保存ボタンを押すと何かしらのエラーが出るわけでもなく、入力したデータがDBにも保存されず、何が原因かがわかりません。
以下、該当のソースになります。

measurements/new.html.erb

ruby

1 2<%= form_with model:@measurement, url: measurements_path, method: :post, local: true do |f| %> 3 <div class="form-input"> 4 <div class="input-measuremet-date"> 5 <p>日付</p> 6 <%= f.date_field :date %> 7 </div> 8 <div class="input-timezone"> 9 <p>時間帯</p> 10 <%= f.select :timezone, ['朝', '昼', '夜', 'その他'], {include_blank: '---'} %> 11 </div> 12 <div class="input-value"> 13 <p>測定値</p> 14 <%= f.text_field :value, id: "value"%>mg/dl 15 </div> 16 </div> 17 <%= f.submit '保存' , class: "measurement-btn" %> 18<% end %> 19

measurements/index.html.erb

ruby

1#省略 2 3<table class='measurement-lists'> 4 <thead> 5 <tr class="measurement-article"> 6 <th>日付</th> 7 <th>時間帯</th> 8 <th>測定値(mg/dl)</th> 9 </tr> 10 </thead> 11 <tbody> 12 <% @measurements.each do |measurement| %> 13 <tr class="measurement-contents"> 14 <td><%= measurement.date %></td> 15 <td><%= measurement.timezone %></td> 16 <td><%= measurement.value %></td> 17 </tr> 18 <% end %> 19 </tbody> 20</table> 21</div> 22 23

measurements_controller.rb

ruby

1 2class MeasurementsController < ApplicationController 3 4 def index 5 @measurements = Measurement.all.order("created_at DESC") 6 end 7 8 def new 9 @measurement = Measurement.new 10 end 11 12 def create 13 @measurement = Measurement.create(measurement_params) 14 if @measurement.save 15 redirect_to measurements_path  #保存できたら一覧画面へ 16 else 17 render "new"        #保存できなければ投稿画面のまま 18 end 19 end 20 21 22 23private 24 def measurement_params 25 params.require(:measurement).permit(:date, :timezone, :value).merge(user_id: current_user.id) 26 end 27end

measurement.rb

ruby

1class Measurement < ApplicationRecord 2 belongs_to :user 3 4 with_options presence: true do 5 validates :date 6 validates :timezone 7 end 8 9 validates :value, format: {with: /\A[0-9]{3}-[0-9]{4}\z/}, 10 numericality: { only_integer: true } 11 12end 13

デバックでmeasurement_params、@measurementの中身を確認すると、保存したいデータとuser_idはきちんと取れているようでした。
他に、コントローラーでMeasurement.create!と記述してみたところ "Validation failed: Value is invalid" というエラーが出るのでバリデーションエラーかと考えたのですが、調べても何が問題なのかがわかりませんでした。

どなたか、こちらの問題点をご教示のほどよろしくお願い致します。

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

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

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

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

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

guest

回答1

0

ベストアンサー

ruby

1 validates :value, format: {with: /\A[0-9]{3}-[0-9]{4}\z/}, 2 numericality: { only_integer: true }

このバリデーションはどういう意味でしょうか。

format:の方では「数字3桁-数字4桁」の条件をかけているのに対して、numericality: { only_integer: true }で整数のみとしているので、このバリデーションを通過できるvalueは1つも存在しません。

投稿2020/11/24 09:43

maisumakun

総合スコア145977

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

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

pico0120

2020/11/24 09:59

早々のご回答ありがとうございます! そしてご指摘をいただきました通り、バリデーションで正規表現の選択を間違っておりました。 format: {with: /\A[0-9]+\z/}に直したら即解決しました。 基本的なところに気が付けず、これだけで何時間も考えてしまっていたのでお恥ずかしい限りです。大変助かりました。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問