Rails의 time_select에서 기본적으로 입력되는 날짜를 화면에 있는 다른 필드의 입력 값으로 설정

배경으로 한 일



Rails의 앱으로 이런 느낌의 양식을 만들었습니다.
실시일을 date_field로 선택하고 시작 시간과 종료 시간을 각각 time_select로 선택합니다.

실행 환경은 rails 5.2.4.2입니다.


view 파일의 내용은 이런 느낌입니다. 데이터 형식은 모든 필드에서 DateTime 형식이었습니다.

보기
.form-group  
  = f.label :date, "実施日"
  = f.date_field :date
.form-group  
  = f.label :begin_at, "開始時間"
  = f.time_select :begin_at
.form-group  
  = f.label :closed_at, "終了時間"
  = f.time_select :closed_at

발생한 문제



이 양식에서 데이터를 제출하면 다음과 같습니다.
#<Activity:0x00007fc97030fe30
 id: 1,
 date: Fri, 11 Sep 2020 00:00:00 JST +09:00,

 begin_at: Mon, 1 Jan 0001 00:10:00 JST +09:00,
 closed_at: Mon, 1 Jan 0001 00:20:00 JST +09:00

 time_took: 600,

 created_at: Fri, 04 Sep 2020 13:53:01 JST +09:00,
 updated_at: Fri, 04 Sep 2020 13:53:01 JST +09:00>

…네? ?
어째서, 서기 1년의 1월 1일의 시간이 되고 있습니까.....

여러가지 조사한 바, 이것은 Rails의 사양일 것 같지 않습니다.
여기 기사처럼 시간만 입력하는 방법도 있었습니다.
(단, begin_at , closed_at 의 데이터형은 Time형으로 할 필요가 있을 것 같습니다)

time_select에서 시간만 입력하도록 허용 [rails]

다만, 이번은, time_took 라고 하는 다른 컬럼에서 「걸린 시간」을 계산하고 있거나, 향후 이러한 숫자를 분석에 사용할 것으로 예상되고 있다고,
begin_at , closed_at 의 값을 사용해 돌리기 때문에, 정확하게 일시를 나타내도록(,) 했습니다.

했던 일



모델에 다음과 같은 메소트를 정의하고 time_select 콜백으로 호출합니다.

모델
class Activity < ApplicationRecord
  before_save :set_the_day_implement

  private

  def set_the_day_implement
    year = self.date.year
    month = self.date.month
    day = self.date.day

    self.begin_at = self.begin_at.change(year: year, month: month, day: day)
    self.closed_at = self.closed_at.change(year: year, month: month, day: day)
  end
end

코드 해설입니다. date 형식으로 양식에서 입력한 '실행일(before_save)'의 해를 각각 검색할 수 있습니다. month, day도 각각 같습니다.
# dateフィールドの値が '2020-09-04'の場合
self.date.year
#=> 2020
self.date.month
#=> 9
self.date.day
#=> 4

또한, self.date.year , date 의 값에는, 각각 다음과 같은 형태로 액세스 할 수 있습니다.
self.begin_at
#=> Mon, 1 Jan 0001 00:10:00 JST +09:00
self.begin_at.year
#=> 1
self.begin_at.month
#=> 1
self.begin_at.day
#=> 1

self.begin_at.change(year: 2020, month: 9, day: 4)
#=> Fri, 4 Sep 2020 00:10:00 JST +09:00

그러나 마지막으로 self.begin_atself.closed_at에 정의 된 내용을 할당하지 않으면 열 값이 업데이트되지 않습니다. (← 여기를 알아차리지 않아 상당히 빠졌다)
# dateフィールドの値が '2020-09-04'の場合
year = self.date.year
month = self.date.month
day = self.date.day

self.begin_at.change(year: year, month: month, day: day)
#=> Fri, 4 Sep 2020 00:10:00 JST +09:00
self.begin_at
#=> Mon, 1 Jan 0001 00:10:00 JST +09:00
# 西暦1年に戻っている

self.begin_at = self.begin_at.change(year: year, month: month, day: day)
self.begin_at
#=> Fri, 4 Sep 2020 00:10:00 JST +09:00
# 代入するとカラムの値が更新される

글쎄, 이제 무사히 원하는 데이터를 얻을 수있었습니다.

결국 뷰에 표시되는 것은 이런 데이터입니다. (괄호 안의 숫자는 다른 콜백으로 만든 "걸린 시간"입니다.)



향후 활용이 예상되는 데이터이므로, 올바른 일자의 데이터가 제대로 들어가 만족했습니다
계속해서 일 노력해 갑니다♪

좋은 웹페이지 즐겨찾기