Отдельные поля формы даты и времени в Rails - PullRequest
40 голосов
/ 09 сентября 2010

У меня есть модель ActiveRecord Event со столбцом даты и времени starts_at.Я хотел бы представить форму, где дата и время для starts_at выбираются отдельно (например, "23-10-2010" для даты и "18:00" для времени).Эти поля должны быть подкреплены одним столбцом starts_at, и проверки должны предпочтительно выполняться также против starts_at.

Я, конечно, могу обойти виртуальные атрибуты и ловушки, но я бы хотел более элегантныйрешение.Я экспериментировал как с composed_of ( rdoc ), так и с атрибутом-декоратором ( обсуждение маяка , github ) без успеха.

Нижеэто грубая схема того, что я хотел бы ..

class Event < ActiveRecord::Base
  validates_presence_of :start_date
end

# View
# On submission this should set start_date.
form_for @event do |f|
  f.text_field :starts_at_date         # date-part of start_date
  f.text_field :starts_at_time_of_day  # time-of-day-part of start_date
  f.submit
end

Любая помощь приветствуется.

Ответы [ 5 ]

39 голосов
/ 18 июля 2011

Нужно ли иметь text_field в виде?

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

form_for @event do |f|
  f.date_select :starts_at
  f.time_select :starts_at, :ignore_date => true
  f.submit
end

Поскольку помощники по дате и времени рельсов устанавливают пять различных параметров (starts_at(1i) для части года, 2i для части месяца и т. д.), это означает, чтоdate_select устанавливает их только для части даты, в то время как если вы передадите :ignore_date => true в time_select, она будет устанавливать только час и минуту.

Если у вас должен быть text_field IЯ не уверен, как это сделать, но можно было бы использовать магию jQuery перед настройкой параметров datetime перед отправкой формы.

9 голосов
/ 13 октября 2013

Сегодня искал проект Rails и наткнулся на этот камень:

https://github.com/shekibobo/time_splitter

Установка DateTimes может быть трудной или уродливой вещью, особенно черезвеб-форма.Найти хороший DatePicker или TimePicker легко, но заставить их работать над обоими может быть сложно.TimeSplitter автоматически генерирует средства доступа для даты, времени, часа и минимума для ваших атрибутов datetime или time, что упрощает использование различных входных данных формы для установки различных частей поля datetime.сделай работу за тебя

3 голосов
/ 07 июня 2014

Использование date_select и time_select - хороший путь.

Однако я хотел получить text_field для даты (чтобы я мог использовать средство выбора даты в JavaScript).

Использование strong_parameters или Rails 4 +:

Модели / event.rb

# Add a virtual attribute
attr_accessor :start_at_date

Вид / События / _form.html.haml

- # A text field for the date, and time_select for time
= f.label :start_at
= f.text_field :start_at_date, value: (f.object.start_at.present? ? f.object.start_at.to_date : nil)
= f.time_select :start_at, :ignore_date => true

Контроллеры / events_controller.rb

# If using a date_select, time_select, datetime_select
# Rails expects multiparameter attributes
# Convert the date to the muiltiparameter parts
def event_params
  if !!params[:event] && (params[:event]["start_at(4i)"].present? || params[:event]["start_at(5i)"].present?)

    if params[:event][:start_at_date].present?
      start_at_date = params[:event][:start_at_date]
    else
      start_at_date = Date.today
    end
    year  = start_at_date.match(/^(\d{4})[\-\/]/)[1]
    month = start_at_date.match(/[\-\/](\d{2})[\-\/]/)[1]
    day   = start_at_date.match(/[\-\/](\d{2})$/)[1]
    params[:event]["start_at(1i)"] = year
    params[:event]["start_at(2i)"] = month
    params[:event]["start_at(3i)"] = day
  end
  ...
2 голосов
/ 02 декабря 2013

Элегантное решение может предоставить date_time_attribute gem :

class MyModel < ActiveRecord::Base
  include DateTimeAttribute

  date_time_attribute :starts_at
end

Это позволит вам установить starts_at_date и starts_at_time отдельно:

form_for @event do |f|
  f.text_field :starts_at_date
  f.text_field :starts_at_time
  f.submit
end

# this will work too:
form_for @event do |f|
  f.date_select :starts_at_date
  f.time_select :starts_at_time, :ignore_date => true
  f.text_field  :starts_at_time_zone
  f.submit
end

# or
form_for @event do |f|
  f.date_select :starts_at_date
  f.text_field  :starts_at_time
  f.submit
end

Это также позволит вам играть с часовыми поясами, использовать Chronic и т. Д.

0 голосов
/ 17 июля 2011

Это из-за проблемы с дизайном? Это действительно намного проще, если вы просто сохраните start_at как тип данных datetime и используете что-то вроде:

http://puna.net.nz/timepicker.htm#

Он просто запускается поверх полей даты, которые у вас есть для вашей модели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...