【rails】devise로 생년월일을 등록할 때의 요령

rails에서 우편 주문 사이트와 같은 것을 만드는 과제에 근무하고 있으며,
devise를 사용하여 사용자 관리를 구현했습니다.
갑작스럽게 구현하여 내놓은 에러를 소개합니다.

[1]date_select 사용



date_select란 무엇인가.
이것은 양식의 입력 형식과 같으며 생년월일과 날짜 및 시간 등록에 매우 유용합니다.

devise/registrations/new.html.haml
  .content_wrapper
    %h2 Sign up
    = form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f|
      = render "devise/shared/error_messages", resource: resource

      -# お名前の入力エリア
      .field
        = f.label :name
        %br/
        = f.text_field :name, autofocus: true, autocomplete: "name"

      -#  生年月日の入力エリア
      .field
        = f.label :birth_date
        %br/
        = f.date_select :birth_date, use_month_numbers: true,start_year: 1930, end_year: (Time.now.year - 10), default: Date.new(1989, 1, 1)




기원과 월일을 입력하는 풀다운이 나타납니다.
풀다운을 3개 준비한다고 생각하고, 「date_select」를 사용하는 것으로, 3개 정리해 나옵니다.


레코드에 들어가는 것은 이런 느낌의 형식이 됩니다.

보통의 풀다운은 select 를 사용합니다만, 그것이라고 입력하는 항목을 스스로 필기하지 않으면 이케나이 때문에 매우 귀찮습니다.

copipe로 구현할 수 있도록 해주는 페이지도 있지만,
많은 양의 코드를 작성하는 대신은 없습니다.

참고
【코피페】HTML 폼의 select 항목 정리(생년월일·연령·도도부현·직업)

[2] 데이터형은 date를 사용한다



테이블을 추가할 때, 생년월일 컬럼의 데이터형은 「date」가 되도록 한다.
그렇지 않으면, haml에 f.date_select 를 기재한 시점에서 데이터형 다르다고 하는 에러가 나옵니다.
마이그레이션 파일은 다음과 같습니다.

20191228100045_devise_create_users.rb
# frozen_string_literal: true

class DeviseCreateUsers < ActiveRecord::Migration[5.2]
  def change
    create_table :users do |t|
      ## Database authenticatable
      t.string :name,              null: false, default: ""
      t.date :birth_date,          null: false
# 省略
    end
# 省略
  end
end


자세한 추가 방법은 아래의 기사를 참고로!

Devise의 설정 순서를 정리해 보았다. 그 1 도입편

[3] 마이그레이션 파일에 default: ""를 쓰지 않음



어쨌든 text나 string과 같은 느낌으로, 데이터형만 date 로 해 두면 마이그레이션할 수 있을 것이라고 생각하면, default: "" 가 써 있는 것으로써 마이그레이션할 수 없었습니다.
[2]에서도 썼습니다만, 아래와 같이 default: "" 없이 하지 않으면, $ rake db:migrate 의 때에 이끼 합니다.
풀다운으로 입력하기 때문에 default: "" 라는 모순이니까 마이그레이트 데키나이요! 라는 것입니다.

20191228100045_devise_create_users.rb
# frozen_string_literal: true

class DeviseCreateUsers < ActiveRecord::Migration[5.2]
  def change
    create_table :users do |t|
      ## Database authenticatable
      t.string :name,              null: false, default: ""
      t.date :birth_date,          null: false
# 省略
    end
# 省略
  end
end


[4]devise를 일본어 대응하면 use_month_numbers: true 추가



달의 표시를 [Jan.][Feb.]등의 영어 표기가 되지 않도록 할 수 있습니다.

devise/registrations/new.html.haml
= f.date_select :birth_date, use_month_numbers: true, ~省略~

몇 번이나 문지르고 있습니다만, 이 부분이군요.

[5] 입력 범위를 좁히자



devise/registrations/new.html.haml
  .content_wrapper
    %h2 Sign up
    = form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f|
      = render "devise/shared/error_messages", resource: resource
~省略~
      -#  生年月日の入力エリア
      .field
        = f.label :birth_date
        %br/
        = f.date_select :birth_date, use_month_numbers: true,
          start_year: 1930, #入力値の開始位置(西暦)
          end_year: (Time.now.year - 10), #入力値の終了位置(現在から10年前に指定)
          default: Date.new(1989, 1, 1) #デフォルトで表示されている値

입력 범위를 좁히지 않고 구현하면, 서기 부분이 끝없이 나오기 때문에, 이와 같이 짜내면 사용자가 선택하기 쉬워집니다.

예를 들어, 18세 이상이 아니면 등록할 수 없는 사이트였던 경우, end_year: (Time.now.year - 18)로 하는 것으로, 18세 이하의 입력을 제한하는 것이 가능할까 생각합니다.
글쎄, 그렇게 많은 욕망은

결론



엄청 기본적이라고 할까, 보통으로 하고 있으면 나오지 않는 에러 내었으므로, 메모가 테라 기사 써 보았습니다.
요령은 범 실수 대책이군요.

devise에서 생일을 입력하는 간단한 미니 앱을 만들고 싶은 분은 아래의 기사를 부디! (PR)
【rails】devise와 date_select를 사용하여 나이의 수만큼 우 ● 코 표시

좋은 웹페이지 즐겨찾기