Короткий ответ: это не имеет значения, они одинаково хороши.
У вас есть 3 разумных места, с которыми вы могли бы справиться.
- В клиенте с javascript на submit.
- В контроллере.
- В модели.
Независимо от того, какой метод вы используете, вам придется обрабатывать данные в контроллере/модели, потому что все параметры принимаются как строки.
В вариантах модели и контроллера у вас есть дополнительное решение. Piece вместе DateTime из 6 полей или используйте пару строк (один из которых содержит значение, одно из которых содержит формат strptime.)
Знание того, что методы конструктора требуют примерно того же объема работы для создания объекта 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
Благодаря нашли время, чтобы написать такой удивительный ответ, я буду делать это в модели. Thanks, – Mike
Без проблем, рада помочь. – EmFi