time_select () helper + jQuery UI datepicker - PullRequest
       2

time_select () helper + jQuery UI datepicker

1 голос
/ 16 ноября 2009

У меня есть форма с time_select и jquery datepicker,

Я хочу иметь возможность при отправке формы объединить значения time_Select и datepicker в один datetime моей модели ActiveRecord ...

Есть ли элегантный способ сделать это? Должен ли я сделать это на стороне клиента или сервера ... Я бы хотел, чтобы мои действия были такими простыми:

  def create
    @drive = Drive.new(params[:drive]))
    if @drive.save
      flash[:notice] = 'Drive created !'
      render :action => :show 
    else
      render :action => :new
    end
  end

Я не знаю ... я должен сделать это с виртуальными атрибутами в модели и объединить их перед сохранением или, возможно, в javascript, когда форма отправляется, или, может быть, у вас есть идея получше ... Что вы думаете ??

Спасибо

Mike.

1 Ответ

3 голосов
/ 16 ноября 2009

Короткий ответ: не имеет значения, они одинаково хороши.

У вас есть 3 разумных места, где вы могли бы справиться с этим.

  1. В клиенте с отправкой javascript.
  2. В контроллере.
  3. В модели.

Независимо от того, какой метод вы используете, вам придется обрабатывать данные в контроллере / модели, поскольку все параметры принимаются в виде строк.

В вариантах модели и контроллера вам необходимо принять дополнительное решение. Соберите 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...