2009-11-16 2 views
1

У меня есть форма с time_select и Jquery DatePicker,time_select() хелпер + JQuery UI 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 

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

Thanks,

Mike.

ответ

3

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

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

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

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

В вариантах модели и контроллера у вас есть дополнительное решение. 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 
+0

Благодаря нашли время, чтобы написать такой удивительный ответ, я буду делать это в модели. Thanks, – Mike

+0

Без проблем, рада помочь. – EmFi