Объедините 3 поля выбора и подтвердите как одно в моей модели пользователя в рубине на рельсах 3

Хорошо, у меня есть 3 поля выбора для выбора даты рождения.

У меня есть константы, настроенные в моей модели User, чтобы указать месяцы, годы и т. Д.

В любом случае я могу успешно проверить эти поля выбора отдельно.

Я хочу объединить: day,: month и: year, сохранить в: birthday и подтвердить всю дату как одну, чтобы я мог вернуть 1 ошибку, а не 3 отдельных.

Это также упростит сохранение подтвержденной даты в поле моего дня рождения в моей базе данных.

Часть моей формы

    <td> <%= f.input :day, :required => false, :label => "Birthday: " , :prompt => "Day", :collection => User::DAYS  %></td>
 <td> <%= f.input :month, :label => false, :prompt => "Month", :collection => User::MONTHS %> </td> 
 <td> <%= f.input :year, :label => false, :prompt => "Year", :collection => User::YEAR_RANGE %> </td> 

Часть модели пользователя

МЕСЯЦЫ = [«Январь», 1], [«Февраль», 2], [«Март», 3], [«Апрель», 4], [«Май», 5], [«Июнь», 6], [«Июль», 7], [«Август», 8], [«Сентябрь», 9], [«Октябрь», 10], [«Ноябрь», 11], [«Декабрь», 12] # закончить DAYS = 1..31 # закончить это START_YEAR = Time.now.year - 106 END_YEAR = Time.now.year YEAR_RANGE = START_YEAR..END_YEAR

class User ‹ActiveRecord :: Base attr_accessor: day,: month,: year

validates_presence_of: day,: message => 'В какой день месяца ты родился?'
validates_presence_of: month,: message => 'В каком месяце ты родился?'
validates_presence_of: year,: message => ' Какой у вас год рождения?

конец


person LondonGuy    schedule 26.06.2011    source источник
comment
Нужно ли отдельно хранить год / месяц / день? Если нет, то почему вы не используете поле даты или даты и времени?   -  person Preacher    schedule 26.06.2011
comment
Нет, мне нужно хранить в одной колонке моей базы данных. Я использовал поле date_select, и все это хорошо хранилось в базе данных, но я потратил 4-5 дней, пытаясь проверить его, но это просто не сработало, поэтому я сдался .. Я попробовал плагины, примеры здесь и разместил здесь 2 вопроса но не мог получить помощь. В итоге я решил создать 3 отдельных поля выбора. Если бы мне пришлось хранить год / месяц / день отдельно, то сейчас все было бы хорошо, но я думаю, что для меня лучше хранить дату как гггг-мм-дд в столбце 1 дБ.   -  person LondonGuy    schedule 26.06.2011
comment
Что вы пытаетесь проверить в обычном столбце даты: наличие, уникальность, в пределах диапазона и т. Д.? Другими словами, нужно ли им просто убедиться, что выбрана дата, или это должно быть что-то более раннее, чем определенное время и т. Д.?   -  person Preacher    schedule 26.06.2011
comment
Во-первых, я хочу убедиться, что они что-то выбрали. Значит, пустые / пустые значения не допускаются. Тогда, может быть, после этого я захочу проверить, что дата действительна.   -  person LondonGuy    schedule 26.06.2011
comment
Каким образом действует? Должны ли они быть определенного возраста?   -  person Preacher    schedule 26.06.2011
comment
Дата действительна как настоящая дата. Так, например, 31 февраля нельзя.   -  person LondonGuy    schedule 26.06.2011


Ответы (2)


Я бы изменил столбец на datetime (дата никогда не работает для меня).

  t.datetime :birthday

Затем используйте в своем представлении date_select.

  <div class="field">
    <%= f.label :birthday %><br />
    <%= f.date_select :birthday, :include_blank => true, :start_year => Time.now.year - 70 %>
  </div>

Затем в вашей модели проверьте наличие дня рождения.

  validates_presence_of :birthday

Если вам нужно убедиться, что день рождения старше определенного возраста, напишите настраиваемую проверку.

  validate :of_certain_age

private

  def of_certain_age
    if self.birthday
      errors.add(:base, 'You need to be at least 18.') if self.birthday > 18.years.ago
    end
  end
person Preacher    schedule 26.06.2011
comment
Пробовал именно это, и это не работает. Сыт по горло и не могу найти причину. Что бы я ни делал, в поле даты не отображаются ошибки. - person LondonGuy; 26.06.2011
comment
Что делать не получается? Я вставил все это из созданного мной демонстрационного приложения. Это не позволяет создавать запись без дня рождения, а также не допускает, чтобы день рождения был меньше 18 лет от текущего дня. - person Preacher; 26.06.2011
comment
Я в основном хочу, чтобы ошибка отображалась рядом с полем дня рождения. Все остальное, что я использую validates_presence_of, показывает соответствующую ошибку рядом с соответствующим полем. С полем даты он никогда не отображается. У меня даже есть поле выбора поля выбора пола, и также отображается ошибка для этого. - person LondonGuy; 26.06.2011

Если я полностью не упущу вашу точку зрения, вам просто нужна настраиваемая проверка. Это пример того, как это сделать.

----- начало кода модели ------

validate :check_date_validity

def check_date_validity 

  date_submitted = Date.strptime("#{self.year}/#{self.month}/#{self.day}" , "%Y/%m/%d")
  errors.add(:birthday, "does not look right") if date_submitted < Date.today  #for example

end

----- код начала просмотра ------

<%= f.select( :day, User::DAYS ) %>

<%= f.select( :month, User::MONTHS ) %>

<%= f.select( :year, User::YEAR_RANGE ) %>

Дополнительную информацию см. В документации rails guides для пользовательской проверки.

person moc    schedule 26.06.2011
comment
У меня это не работает. Захватывает ли он значения: day,: month и: year? Потому что мне нужно проверить, есть ли какие-либо значения, и если нет, проверка не выполняется и отображается ошибка. Таким образом, необходимо выбрать все 3 поля выбора. - person LondonGuy; 26.06.2011
comment
self.year, self.month и self.day относятся к значениям, вводимым с помощью select в форме. - person moc; 27.06.2011