#controllers
class SchedulesController < ApplicationController
def create
params[:schedule][:tasks_attributes].each do |_, task_attributes|
if task_attributes["task_time(4i)"].blank? && task_attributes["task_time(5i)"].blank?
task_attributes.delete("task_time(1i)")
task_attributes.delete("task_time(2i)")
task_attributes.delete("task_time(3i)")
else
year = task_attributes["task_time(1i)"].to_i
month = task_attributes["task_time(2i)"].to_i
day = task_attributes["task_time(3i)"].to_i
hour = task_attributes["task_time(4i)"].to_i
minute = task_attributes["task_time(5i)"].to_i
task_time = Time.zone.local(year, month, day, hour, minute)
end
end
@schedule = current_user.schedules.build(schedule_params)
if @schedule.save
redirect_to schedule_path(@schedule), notice: 'スケジュールが作成されました。'
else
render :new, status: :unprocessable_entity
end
end
def update
params[:schedule][:tasks_attributes].each do |_, task_attributes|
if task_attributes["task_time(4i)"].blank? && task_attributes["task_time(5i)"].blank?
task_attributes.delete("task_time(1i)")
task_attributes.delete("task_time(2i)")
task_attributes.delete("task_time(3i)")
end
end
if @schedule.update(schedule_params)
redirect_to schedule_path(@schedule)
else
render :edit
end
end
#config
#application.rb
module Yoriyoi
class Application < Rails::Application
# Initialize configuration defaults for originally generated Rails version.
config.load_defaults 7.0
# i18n
config.i18n.default_locale = :ja
config.i18n.load_path += Dir[Rails.root.join('config', 'locales', '**', '*.yml').to_s]
#time_zone
config.time_zone = 'Asia/Tokyo'
# Configuration for the application, engines, and railties goes here.
#
# These settings can be overridden in specific environments using the files
# in config/environments, which are processed later.
#
# config.time_zone = "Central Time (US & Canada)"
# config.eager_load_paths << Rails.root.join("extras")
# Don't generate system test files.
config.generators.system_tests = nil
end
end
質問内容・実現したいこと スケジュールのタスクを行う時間について、正しい時間が登録されない事象の解消
現状発生している問題・エラーメッセージ エラーメッセージは出ていませんが、formへ例えば、00:00と保存した際にparamsでは00:00と送れているにもかかわらず、 showの画面で登録できたデータを確認すると23:41となってしまいます。
↓
以上のように規則性があるような形で19分ずつ時間がずれてしまいます。
どの処理までうまく動いているのか
updateで修正を行なった際には、pramsとsaveが正しい値で保存されます。
edit画面では、以下のような表示になっています
該当のソースコード
試したこと
paramsを確認した時点では正しい時間が送られている。
時刻については規則性があるようなのでタイムゾーンも疑い記述を行いました。
editに移った際に分の部分が空白になってしまっているため、うまく保存ができていない?(後ほどバリデーションを組みます)
controllerでのifの部分の記述については、time型で年月日が自動で保存されてしまう事象に対して、gem cocoonを使用してformの複製を行った際に、ユーザーが空のデータをsaveをした際に年月日が入ってしまうためdeleteを行いnilになるようにしています。
else以降の部分でtask_time = Time.zone.local(year, month, day, hour, minute)ということで時刻合わせができるかと思い記述しました(できていませんが)
pythonで19分時間がズレるという記事がありましたが、Railsでは記事がでませんでした https://qiita.com/suzuki-navi/items/9ed7670aa4a93cf021d2
デバッグで確認すると@schedule.saveの前後で書き変わってしまっているようです save前は以下のようになります [3] pry(#)> @schedule.tasks
=> [#<Task:0x0000000106d91ff0
id: nil,
schedule_id: nil,
task_time: Mon, 01 Jan 0001 00:00:00.000000000 LMT +09:18,
to_do: "月曜日",
memo: "",
goal_select: false,
created_at: nil,
updated_at: nil>]
save後は以下のようになりました [1] pry(#)> @schedule.tasks
Task Load (0.4ms) SELECT "tasks".* FROM "tasks" WHERE "tasks"."schedule_id" = $1 [["schedule_id", 41]]
↳ app/controllers/schedules_controller.rb:34:in `create'
=> [#<Task:0x0000000106f9af18
id: 83,
schedule_id: 41,
task_time: Sat, 01 Jan 2000 23:41:01.000000000 JST +09:00,
to_do: "月曜日",
memo: "",
goal_select: false,
created_at: Mon, 25 Sep 2023 19:23:21.732369000 JST +09:00,
updated_at: Mon, 25 Sep 2023 19:23:21.732369000 JST +09:00>]
[2] pry(#)>