10

Как вы можете преобразовать поле datetime mysql в два поля формы (1) только для даты (2) и объединить оба поля обратно в формат даты и времени на форме submit?Rails 4 - Преобразование даты и времени в отдельные поля даты и времени

Это позволит использовать следующие драгоценные камни, но хранить даты в одном поле даты и времени:

gem 'bootstrap-datepicker-rails' 
gem 'bootstrap-timepicker-rails' 

Спасибо заранее!

ответ

15

Найдено решение с помощью от @Althaf

Добавлено виртуальные атрибуты model.rb Используется before_save обратного вызова для преобразования обратно в DateTime.

before_save :convert_to_datetime 

def sched_date_field 
    sched_date.strftime("%d/%m/%Y") if sched_date.present? 
end 

def sched_time_field 
    sched_time.strftime("%I:%M%p") if sched_time.present? 
end 

def sched_date_field=(date) 
    # Change back to datetime friendly format 
    @sched_date_field = Date.parse(date).strftime("%Y-%m-%d") 
end 

def sched_time_field=(time) 
    # Change back to datetime friendly format 
    @sched_time_field = Time.parse(time).strftime("%H:%M:%S") 
end 

def convert_to_datetime 
    self.sched_time = DateTime.parse("#{@sched_date_field} #{@sched_time_field}") 
end 

Использование Rails 4, необходимо добавить sched_date_field и sched_time_field строгим Params в controller.rb

Вот поля в _form.html.erb

<%= f.label :sched_date_field, "Scheduled Date" %> 
<%= f.text_field :sched_date_field, :class => "datepicker" %> 

<%= f.label :sched_time_field, "Scheduled Time" %> 
<%= f.text_field :sched_time_field, :class => "timepicker" %> 
+0

По строгим параметрам, вы имеете в виду «сильные параметры»? Кроме того, этот код, похоже, вызывает неопределенную ошибку переменной в sched_time. –

+2

Это немного кромка, но если вы используете эту технику и требуете какой-либо проверки в поле «sched_time», она не удастся. Вы можете попробовать изменить 'before_save' на' before_validation'. Но опять же, это может завершиться неудачно, если у вас есть каскадные проверки. Немного трудно объяснить в этом коротком комментарии, но поверьте мне, это провалится. – Karl

+0

@ Karl, что вы рекомендуете вместо этого? Я сталкиваюсь с этой проблемой.Я думаю об изменении модели данных для хранения даты, времени и часового пояса в виде трех отдельных полей. – Turgs

4

Вы можете использовать виртуальные атрибуты See this Railscast, и если у вас есть подписка pro the revised one.

В основном в виде вы бы следующие

<%= f.label :date_field %> 
<%= f.text :date_field %> 
<%= f.label :time_field %> 
<%= f.text :time_field %> 

Ваша база данных будет по-прежнему держать поле, которое я буду называть full_date

Теперь в вашей модели вы должны определить вышеуказанные 2 поля, как следующим образом.

def date_field # What this returns will be what is shown in the field 
    full_date.strftime("%m-%d'%y") if full_date.present? 
end 

def time_field 
    full_date.strftime("%I:%M%p") if full_date.present? 
end 

def time_field=(time) 
    full_date = DateTime.parse("#{date_field} #{time_field}) 
end 

Так это выглядит, как вы используете Rails 4, вам придется разрешить date_field и time_field в ваших сильных параметров.

+0

Я думал, что это будет способ сделать это. Я должен был добавить несколько вещей к вашему решению, чтобы заставить его работать. – jverban

+0

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

+0

Не удалось определить, как правильно отформатировать решение в этой области комментариев ответа, поэтому я разместил решение ниже. Спасибо за вашу помощь. – jverban

6

Вы могут использовать date_time_attribute gem:

class MyModel < ActiveRecord::Base 
    include DateTimeAttribute 

    date_time_attribute :scheduled_at 
end 

Это позволит вам установить schedule_at_date и scheduled_at_time отдельно. Как только атрибуты будут установлены, значения будут объединены в schedule_at.

Смежные вопросы