Хелперы datetime_select и time_select используются для генерации блока dropdown-полей выбора даты и времени (или только времени) внутри формы. По умолчанию минуты выводятся от 00 до 59 с шагом 1.
Зачастую такая точность не нужна, а кроме того, неудобно использовать выпадающий список из 60 значений. Параметр :minute_step позволяет указать нужный нам шаг изменения значения минут.
Как многое в Rails, эти хелперы обладают некоторым уровнем “интеллекта”—для значения “по умолчанию” они используют текущее дату и время (если вы не указали :include_blank => true). И вот с этим есть небольшая проблема. О ней и ее решении читаем ниже.
Она в том, что при использовании опции :minute_step значение минут округляется до 00, если переданное в хелпер значение времени не кратно значению :minute_step. Таким образом, указав :minute_step => 5 мы получим эффект невозможности отобразить 42 минуты.
Понятно, что если ваше приложение “считает” минуты с некоторым шагом, то и значения минут будут также кратны этому шагу. Но что делать при операции создания записи? Т.е. когда устанавливается текущее время, а это невсегда кратно шагу.
Допустим шаг у нас 5 минут, а текущее время 15:42, тогда в форме создания записи вы увидите время 15:00, и нужно будет кликать и выбирать ближайшее удобное значение (40 или 45 минут). Это невсегда удобно.
Вариант решения?
Один из вариантов—округлить значение текущего времени до точки кратной нашему шагу. В коде это будет выглять вот так:
или для time_select
Таким образом мы всегда будем иметь в полях ввода минут ближайшее к удобному для нас значение.
Приятной работы!
Материал из блога Hash Train
Зачастую такая точность не нужна, а кроме того, неудобно использовать выпадающий список из 60 значений. Параметр :minute_step позволяет указать нужный нам шаг изменения значения минут.
Как многое в Rails, эти хелперы обладают некоторым уровнем “интеллекта”—для значения “по умолчанию” они используют текущее дату и время (если вы не указали :include_blank => true). И вот с этим есть небольшая проблема. О ней и ее решении читаем ниже.
В чем проблема?
Она в том, что при использовании опции :minute_step значение минут округляется до 00, если переданное в хелпер значение времени не кратно значению :minute_step. Таким образом, указав :minute_step => 5 мы получим эффект невозможности отобразить 42 минуты.
Понятно, что если ваше приложение “считает” минуты с некоторым шагом, то и значения минут будут также кратны этому шагу. Но что делать при операции создания записи? Т.е. когда устанавливается текущее время, а это невсегда кратно шагу.
Допустим шаг у нас 5 минут, а текущее время 15:42, тогда в форме создания записи вы увидите время 15:00, и нужно будет кликать и выбирать ближайшее удобное значение (40 или 45 минут). Это невсегда удобно.
Вариант решения?
Один из вариантов—округлить значение текущего времени до точки кратной нашему шагу. В коде это будет выглять вот так:
<%= datetime_select :created_at, :default => (Time.current.min % 5).minutes.ago(Time.current), :minute_step => 5 %>
или для time_select
<%= time_select :created_at, :default => (Time.current.min % 5).minutes.ago(Time.current), :minute_step => 5 %>
Таким образом мы всегда будем иметь в полях ввода минут ближайшее к удобному для нас значение.
Приятной работы!
Материал из блога Hash Train