Время выбора формы помощника с 12-часовым форматом для Rails 3? - PullRequest
10 голосов
/ 24 марта 2011

Есть ли удобный для пользователя time_select для Rails 3? По умолчанию помощник формы time_select дает вам часы [00-23], минуты [00-59] и, необязательно, секунды [00-59]. Раскрывающийся список часов 0-23 довольно разочаровывает тех из нас, кто не в военное время. Удобное решение будет отображать часы 1-12 и дополнительный выпадающий список утра / вечера.

Есть ли опция или отдельный плагин для этого? Я не могу быть первым человеком, который хочет этого, но я не нашел никаких решений.

Спасибо!

Ответы [ 5 ]

14 голосов
/ 25 августа 2012

Вы можете установить: для параметра ampm значение true, которое будет отображать часы как: 12:00, 01:00 .. 11:00.

time_select 'game', 'game_time', {:ampm => true}

http://api.rubyonrails.org/classes/ActionView/Helpers/DateHelper.html#method-i-time_select

1 голос
/ 28 апреля 2011

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

Кроме того, если 12:00 - 0 или 24, то тоже можно настроить.

Вот база с использованием ванили select_tag:

<%= f.select :your_attribute, [ 
     ["6am", 6], ["7am", 7], ["8am", 8], ["9am", 9], ["10am", 10], ["11am", 11], ["12pm", 12], ["1pm", 13], ["2pm", 14], ["3pm", 15], ["4pm", 16], ["5pm", 17], ["6pm", 18], ["7pm", 19], ["8pm", 20], ["9pm", 21], ["10pm", 22], ["11pm", 23], ["12am", 24], ["1am", 1], ["2am", 2], ["3am", 3], ["4am",4 ], ["5am", 5]
], class:''%>

Он отображает 12-часовое время для вашего пользователя и отправляет 24-часовое целое число на ваш сервер.

Обновление

Мне все равно нужен был один, поэтому я пошел дальше и написал это .... По мнению:

<%= am_pm_hour_select f, :your_method, start:3 %>

(обратите внимание, что синтаксис не f.helper, а helper f, other_options)

В app/helpers/am_pm_form_helper.rb:

module AmPmFormHelper
  #pass start:Fixnum in the options hash to set the first drop down selection
  def am_pm_hour_select(object, method, options = {}, html_options = {})
    select_options = [ ["6am", 6], ["7am", 7], ["8am", 8], ["9am", 9], ["10am", 10], ["11am", 11], ["12pm", 12], ["1pm", 13], ["2pm", 14], ["3pm", 15], ["4pm", 16], ["5pm", 17], ["6pm", 18], ["7pm", 19], ["8pm", 20], ["9pm", 21], ["10pm", 22], ["11pm", 23], ["12am", 24], ["1am", 1], ["2am", 2], ["3am", 3], ["4am",4 ], ["5am", 5]]
    unless options[:start].nil?
      shift_if_needed = Proc.new{|hour, start| hour<start ? hour+24 : hour}
      select_options.sort!{|x, y| shift_if_needed.call(x.last,options[:start]) <=> shift_if_needed.call(y.last, options[:start]) }
    end

    object.select(method, select_options, options = {}, html_options = {})
  end
end
0 голосов
/ 05 мая 2011

У меня была такая же проблема, и я увидел этот пост, поэтому подумал, что дам свой ответ:

module DateTimeSelectorExtensions
  def self.included(base)
    base.send(:include, InstanceMethods)
    base.send(:alias_method_chain, :select_hour, :twelve_hour_time)
  end

  module InstanceMethods
    def select_hour_with_twelve_hour_time 
      return select_hour_without_twelve_hour_time(@datetime, @options) unless @options[:twelve_hour].eql? true
      if @options[:use_hidden] || @options[:discard_hour]
        build_hidden(:hour, hour)
      else
        select_options = []
        0.step(23, 1) do |value|
          if value == 0 && @options[:midnight]
            text = @options[:midnight].eql?(true) ? 'midnight' : @options[:midnight]
          elsif value == 12 && @options[:noon]
            text = @options[:noon].eql?(true) ? 'noon' : @options[:noon]
          else
            text = "#{value == 12 ? 12 : (value / 12 == 1 ? value % 12 : value)}#{value <= 11 ? ' AM' : ' PM'}"
          end
          tag_options = { :value => value }
          tag_options[:selected] = "selected" if hour == value
          select_options << content_tag(:option, text, tag_options)
        end
        select_options.rotate!(@options[:offset].to_i)
        select_options.unshift(@options[:prompt]) if @options[:prompt].present?
        build_select(:hour, (select_options.join("\n") + "\n").html_safe)
      end       
    end  
  end
end

ActionView::Helpers::DateTimeSelector.send(:include, DateTimeSelectorExtensions)

Вы используете его так:

select_hour Time.now, :twelve_hour => true, :offset => 6, :prompt => "--", :midnight => true, :noon => "high noon"
0 голосов
/ 02 апреля 2011

Одна простая вещь, которую вы могли бы сделать, - это конвертировать военные 0..23 в стандартные 12:00, 1:00, 2:00, 10:00, 11:00.

Это хорошо работает для моей ситуации - я обычно просто выбираю час - но это, я признаю, не идеально, с уменьшением am / pm в часе

= javascript_tag "$$('#event_start_at_4i option').each(function(option) { option.update(convert_hour(option.innerHTML)) })"

Тогда в Javascript (это может быть чище)

function convert_hour(hour_string) {   
  if (hour_string.substring(0,1) == 0) {
    hour_string = hour_string.substring(1);   
  }   
  // Funny '08' parses to 0, but '07' parses to 7.  Removing leading 0 above fixes.
  var mh = parseInt(hour_string)   
  if (!isNaN(mh)) {
    var nh = mh % 12
    if (nh == 0) { nh = 12 }
    if (mh < 12) {
      nh = nh + 'am'
    } else {
      nh = nh + 'pm'
    }
    return nh   
  }   
  return hour_string 
}
0 голосов
/ 24 марта 2011

для таких целей я рекомендую использовать jQuery UI. это намного удобнее для пользователя

вот ссылка

...