Короткий ответ: не имеет значения, они одинаково хороши.
У вас есть 3 разумных места, где вы могли бы справиться с этим.
- В клиенте с отправкой javascript.
- В контроллере.
- В модели.
Независимо от того, какой метод вы используете, вам придется обрабатывать данные в контроллере / модели, поскольку все параметры принимаются в виде строк.
В вариантах модели и контроллера вам необходимо принять дополнительное решение. Соберите DateTime из 6 полей или используйте пару строк (одна содержит значение, другая содержит формат strptime.)
Зная, что методы конструктора DateTime требуют примерно такого же объема работы для создания объекта datetime из набора отдельных полей, как и для построения объекта из строки datetime и строки формата. На самом деле не имеет значения, как вы строите объект DateTime.
Так что все сводится к вопросу личных предпочтений.
Лично я считаю, что эта логика принадлежит модели. Я бы не включил его в javavascript, потому что хотел бы убедиться, что мой код не сломается, если Javascript отключен. Контроллер одинаково хорошо подходит. Но я чувствую, что выгрузка этой логики в модель позволяет более надежно обрабатывать даты и проверки. Я также считаю, что конструктор strptime гораздо легче читать, чем гражданский конструктор с 7 аргументами. Но гражданский конструктор не требует, чтобы я форматировал часы / минуты / секунды точно в 2 цифры. В любом случае я буду передавать смещение года, месяца, дня, часа, минуты и секунды в виде отдельных полей attr_accessors, поэтому я при необходимости получу данные для обработки.
Пример кода
class Drive < ActiveRecord::Base
...
attr_accessor :year, :month, :day, :hour, :minute, :second, :locale_offset
before_validation :build_date
validates :future_time
def build_date
begin
self.date = DateTime.civil( year.to_, month.to_i, day.to_i,
hour.to_i, minute.to_i, second.to_i, user.locale_offset)
rescue
errors.add(:date, "Invalid date")
return false
end
end
def future_time
unless date > DateTime.now
errors.add(:date, "Date occurs in the past.")
end
end
end