Метод установки Rails Datetime - PullRequest
       18

Метод установки Rails Datetime

1 голос
/ 09 сентября 2009

У меня есть столбец datetime в модели, и я хочу отобразить форму для этого в виде отдельных текстовых полей для времени вместо всплывающих меню помощника datetime_select.

Я знаю, что мне придется как-то проверить и воссоздать дату, чтобы вернуться в БД, но я не уверен, как.

Должен ли я использовать методы получения и установки виртуальных атрибутов? EG ...

def virtual_minute=(minute)
  ...
end

def virtual_hour=(hour)
  ...
end

Или, может быть, в обратном вызове?

Немного ошарашено!

Ответы [ 3 ]

2 голосов
/ 09 сентября 2009

Вам не нужно писать их самостоятельно, если вы используете модель ActiveRecord. Многопараметрические атрибуты могут быть отправлены через формы по частям. В качестве примера рассмотрим, как работает метод datetime_select, который вам не очень нравится:

http://apidock.com/rails/ActionView/Helpers/DateHelper/datetime_select

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

Значения здесь отображаются в виде параметров, именуемых чем-то вроде:

model_type[attribute(1i)]
model_type[attribute(2i)]
model_type[attribute(3i)]

Они объединяются в правильном порядке, преобразуются по мере необходимости и передаются в конструктор для этих атрибутов определенного типа, например DateTime.

Это избавляет от необходимости создавать собственные методы-оболочки.

В любом случае, простым способом создания атрибутов является использование метода attr_accessor, например:

class MyModel < ActiveRecord::Base
  attr_accessor :some_date
end

Это создаст соответствующие методы доступа и мутатора.

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

1 голос
/ 09 сентября 2009

Виртуальные атрибуты являются хорошим IMO, поскольку они хранят пользовательские данные в переменной экземпляра. Затем в before_save вы создаете объект Time, присваивая его реальной переменной.

0 голосов
/ 17 ноября 2011

Я пытался разделить время от даты (думаю, это ваш вопрос), когда я взглянул на исходный код и нашел параметр :ignore_date:

time_select также сгенерирует 3 входных скрытых тега, для фактического год, месяц и день, если для параметра : ignore_date не установлено значение правда.

Если вы установите для : ignore_date значение true, вы должны иметь date_select для того же метода в форме, в противном случае исключение будет возбуждено.

Другими словами, установив его в true, можно разделить дату и время.

См. time_select и date_select

(также можно использовать выбор даты и времени с помощью :discard_day, :discard_hour ...)

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