Ввод даты simple_form не соответствует выбранному

Я использую simple_form, и мне нужно выбрать дату как 3 отдельных поля ввода (день, месяц, год).

Это то, что у меня есть, но это определенно не то, что я хочу.

<%= f.date_select :date_of_birth, start_year: Date.today.year - 16,
                            end_year: Date.today.year - 100,
                            order: [:day, :month, :year], label: false %>

Спасибо за помощь!

На данный момент я просто предполагаю, что мне придется заменить date_of_birth тремя полями в БД и просто написать метод, который соберет их в фактическую дату рождения, что я считаю уродливым путем и надеюсь, что есть лучший.


person Andrey Deineko    schedule 04.12.2014    source источник


Ответы (2)


Пытаться

= date_select 'object_name', :date_of_birth

Где вы должны заменить «object_name» на имя вашего объекта. Например, «пользователь» для класса пользователя и так далее.

Но имейте в виду, что такой подход может сломать вашу разметку, потому что simple_form добавляет свои div и другие обертки для полей формы. Так что вы должны добавить их тоже.

person Stanislav Mekhonoshin    schedule 04.12.2014
comment
Спасибо за ответ! Это было очень срочно, поэтому я остановился на 3-х полях в БД и методе сборки. - person Andrey Deineko; 05.12.2014

Я решил просто добавить 3 поля в базу данных:

  t.integer :birth_day
  t.integer :birth_month
  t.integer :birth_year

напишите несколько проверок:

  validates :birth_day, 
            numericality: { only_integer: true, message: "Please enter numbers only." }, 
            length: { is: 2, message: "Should be 2 digits." },
            inclusion: { in: 1..31, message: 'should be in range 1..31'}
  validates :birth_month, 
            numericality: { only_integer: true, message: "Please enter numbers only." }, 
            length: { is: 2, message: "Should be 2 digits." },
            inclusion: { in: 1..12, message: 'should be in range 1..31'}
  validates :birth_year, 
            numericality: { only_integer: true, message: "Please enter numbers only." }, 
            length: { is: 4, message: "Should be 4 digits." },
            inclusion: { in: 1900..1996, message: 'should be in range 1900..1996'}

и напишите метод для метода сборки объекта даты:

  def date_of_birth
    "#{birth_day}/#{Date::MONTHNAMES[birth_month]}/#{birth_year}".to_date
  end
person Andrey Deineko    schedule 05.12.2014