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

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

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

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails 7

Ruby on Rails 7は、2021年12月に正式リリースされました。Ruby on Railsのバージョン7であり、フロントエンド開発環境を大幅に刷新。Node.jsを用いない構成がデフォルトになっています。

Q&A

解決済

1回答

651閲覧

Ruby on rails7において特定のカラムだけ値を保存できない。

ruler

総合スコア2

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails 7

Ruby on Rails 7は、2021年12月に正式リリースされました。Ruby on Railsのバージョン7であり、フロントエンド開発環境を大幅に刷新。Node.jsを用いない構成がデフォルトになっています。

1グッド

1クリップ

投稿2023/03/05 16:19

編集2023/03/06 15:27

実現したいこと

  • Ruby on rails7において、save_timeというカラムに文字列を保存したい。

前提

Ruby on rails7で健康観察アプリを作成しています。
save_timeというカラム以外には値が保存されるのですが、save_timeだけにはnilが保存されます。
エラーメッセージなどは特に出ないです。
下記に示すコードにおいて23行目が該当コードです。

該当のソースコード

controller.rb

1class HealthsController < ApplicationController 2 before_action :set_q 3 def top 4 end 5 6 def index 7 @health=Health.all 8 @results=@q.result 9 end 10 11 def show 12 @health=Health.all 13 @results=@q.result 14 end 15 16 def new 17 @health=Health.new 18 @date=Date.today 19 end 20 21 def create 22 health=Health.new(health_params) 23 health.save! 24 redirect_to(healths_url, notice: "送信を完了しました。") 25 end 26 27 def search 28 @results=@q.result 29 end 30 31 private 32 33 def health_params 34 params.require(:health).permit(:year, :school_class, :class_number, :name, :commute, :temperature, :etc) 35 end 36 37 def set_q 38 @q=Health.ransack(params[:q]) 39 end 40end 41

Ruby

1<h1>健康観察アプリ</h1> 2<% require "date" %> 3<%= link_to "ホーム画面に戻る", "/healths" %>|<%= link_to "全体検索を行う", "/healths/show" %>|<%= link_to "個別検索を行う", "/healths/index"%> 4<% # コントローラーで生成されたインスタンスメソッド@healthにデータを付与 %> 5<%= form_with(model: @health, local: true) do |form| %> 6 <table> 7 <tr> 8 <td>学年(選択必須)</td><td><%= form.select :year, [["1年","1年"], ["2年","2年"], ["3年","3年"]],{include_blank: '選択してください'} %></td> 9 </tr> 10 <tr> 11 <td>(選択必須)</td><td><%= form.select :school_class, [["A組","A組"], ["B組","B組"], ["C組","C組"],["D組","D組"], ["E組","E組"], ["F組","F組"],["G組","G組"], ["H組","H組"], ["I組","I組"]],{include_blank: '選択してください'} %></td> 12 </tr> 13 <tr> 14 <td>出席番号(選択必須)</td><td><%= form.select :class_number, [["1番",1], ["2番",2], ["3番",3],["4番",4], ["5番",5], ["6番",6],["7番",7], ["8番",8], ["9番",9],["10番",10], 15 ["11番",11], ["12番",12], ["13番",13],["14番",14], ["15番",15], ["16番",16],["17番",17], ["18番",18], ["19番",19],["20番",20], 16 ["21番",21], ["22番",22], ["23番",23],["24番",24], ["25番",25], ["26番",26],["27番",27], ["28番",28], ["29番",29],["30番",30], 17 ["31番",31], ["32番",32], ["33番",33],["34番",34], ["35番",35], ["36番",36],["37番",37], ["38番",38], ["39番",39],["40番",40],],{include_blank: '選択してください'} %></td> 18 </tr> 19 <tr> 20 <td>氏名(入力必須)</td><td><%= form.text_field :name, {include_blank: '入力して下さい'} %></td></td> 21 </tr> 22 <tr> 23 <td><% form.text_area :save_time,value: @date.strftime("%Y-%m-%d") %></td> 24 <tr> 25 </table> 26 <hr> 27 <%= form.radio_button :commute, "登校" %><%= form.label :commute, "登校", value: "登校"%> 28 <%= form.radio_button :commute, "遅刻" %><%= form.label :commute, "遅刻", value: "遅刻"%> 29 <%= form.radio_button :commute, "欠席" %><%= form.label :commute, "欠席", value: "欠席"%> 30 <table> 31 <tr> 32 <% # 初期値は右寄せが必要 %> 33 <td>測定した体温</td><td><%= form.text_field :temperature, value: "度"%></td> 34 </tr> 35 <tr> 36 <td>その他</td><td><%= form.text_area :etc %></td> 37 </tr> 38 </table> 39 <%= form.submit %> 40<% end %>

試したこと

save_timeがnilになってしまう該当コード

<td><% form.text_area :save_time,value: @date.strftime("%Y-%m-%d") %></td> において、表示する必要がないので<%%>としていますが、<%= %>にするときちんとその日の日付がyyyy-mm-dd形式の文字列で表示されます。 しかし、文字列が初期値として入力されていることは確認できましたが、この文字列をsave_timeカラムに保存するとなるとnilになってしまいます。 save_timeのデータ型なども確認しましたが、string型になっています。 関係ないかもしれないですが、 config/application.rbにおいて config.time_zone="Tokyo" を追加、 config/initializers/配下に Time::DATE_FORMATS[:default]="%Y-%m-%d" と書いたファイルを作成しています。

<追記>
コントローラーのコードを追加しました。
今回の質問に該当するアクションはnewアクションとcreateアクションで
newアクションはget, createアクションはpostをルーティングで指定しています。

shinoharat👍を押しています

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

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

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

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

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

maisumakun

2023/03/05 22:06

コントローラー側のコードもご提示ください。
ruler

2023/03/06 15:29

失礼しました。 質問のほうにコントローラーのコードを追加、及び試したことの欄に<追記>をしました。
ruler

2023/03/06 15:37

追加のコメントとなってしまい、申し訳ありません。 再度自分でコントローラーをチェックしたところ、createアクションにおいて@healthがhealthになっていたため、ビューファイルにデータを渡すことができていないだけでした、、。
guest

回答1

0

ベストアンサー

修正案1

save_time が <% %> になっているので、そもそも view にデータが出力されていません。
「目には見えないけど実はデータ持ってる」とかじゃなくて、ガチでまったくデータが無い状態なので、当然保存もされません。

「画面に表示する必要はないけどデータは送信したい」という場合は <%= %>hidden_field を組み合わせて利用してください。

erb

1<%= form.hidden_field :save_time, value: @date.strftime("%Y-%m-%d") %>

修正案2

また、もし @date が固定値なら、 view を介さずに controller で直接データセットしても良いと思います。
(view の hidden フィールドは開発者ツールなどで値が改ざんされる可能性も加味して設計する必要があります)

diff

1 def create 2 @health = Health.new(health_params) 3 4+ @health.save_time = @date.strftime("%Y-%m-%d") 5 6 if @health.save 7 ... 8 end 9 end

投稿2023/03/06 01:03

shinoharat

総合スコア1676

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

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

ruler

2023/03/06 15:38

修正案2を実行しようと、コントローラーのコードを見たところ凡ミスに気づきました。 回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問