前提
DBにstart_datetimeというカラムがありDatetimeクラスで保存しています。
その年月日を保存・取り出すためにstart_day_accessor、時間を保存・取り出すためにstart_time_accessorを準備しています。
Ruby
1class Schedule < ApplicationRecord 2 attr_accessor :start_day_accessor 3 attr_accessor :start_time_accessor 4 5 before_save :datetime_format 6 def datetime_format 7 self.start_datetime = Time.zone.parse(self.start_day_accessor 8 + ' ' + self.start_time_accessor).to_datetime 9end
Ruby
1<%= form.text_field :start_day_accessor %> 2<%= form.select :start_time_accessor, options_for_select(time_array_for_select) %> 3 4# time_array_for_select = ['', '00:00', '00:15', '00:30', '00:45', '01:00',..... ]
実現したいこと
attr_accessorを初期化してDBからの値を渡したいです。
具体的には、
- 編集ページでは、保存されているレコードの値をそれぞれ(Select、Input)のフォームに表示したいです。
- 新規ページでは、バリデーションエラーのときに入力した値を保持したいです。
初期化したい値はそれぞれ下記となります。
:start_day_accessor
に@schedule.start_datetime.strftime("%Y-%m-%d")
:start_time_accessor
に@schedule.start_datetime.strftime("%H:%M")
試したこと
基本的なことだと思うのですが、かなり検索して手を動かしたのですが、attr_accessorへの理解が足りないため解決策にたどり着けませんでした。
下記だとバリデーションエラーのときに入力した値が保持できませんでした。
<%= form.text_field :start_day_accessor, value: @schedule.start_datetime.nil? ? '' : @schedule.start_datetime.strftime("%Y-%m-%d") %> <%= form.select :start_time_accessor, options_for_select(time_array_for_select, @schedule.start_datetime.nil? ? '' : @schedule.start_datetime.strftime("%H:%M")) %>
下記にて解決しました。
Ruby
1#controller 2def schedule_params 3 params[:schedule][:start_datetime] = (params[:schedule][:start_date] + ' ' + params[:schedule][:start_time]).to_s 4 params.require(:schedule).permit(... 5end
Ruby
1#view 2 <%= form.text_field :start_date %> 3 <%= form.text_field :start_time %>
Ruby
1#model 2class Schedule < ApplicationRecord 3 def start_date 4 start_datetime.strftime("%Y-%m-%d") if start_datetime.present? 5 end 6 7 def start_time 8 start_datetime.strftime("%H:%M") if start_datetime.present? 9 end 10end

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/07/12 01:58
2022/07/12 02:09
2022/07/12 02:23
2022/07/12 02:58
2022/07/12 05:41