Rails 3 有用户友好的 time_select 吗?默认的 time_select 表单助手为您提供小时 [00-23]、分钟 [00-59] 和可选的秒 [00-59]。对于我们这些不在军事时间的人来说,0-23 小时的下拉列表非常令人沮丧。一个用户友好的解决方案将显示 1-12 小时和一个额外的上午/下午下拉列表。
是否有一个选项或一个单独的插件来处理这个?我不能成为第一个想要这个的人,但我还没有找到任何解决方案。
谢谢!
Rails 3 有用户友好的 time_select 吗?默认的 time_select 表单助手为您提供小时 [00-23]、分钟 [00-59] 和可选的秒 [00-59]。对于我们这些不在军事时间的人来说,0-23 小时的下拉列表非常令人沮丧。一个用户友好的解决方案将显示 1-12 小时和一个额外的上午/下午下拉列表。
是否有一个选项或一个单独的插件来处理这个?我不能成为第一个想要这个的人,但我还没有找到任何解决方案。
谢谢!
您可以将 :ampm 选项设置为 true,它将显示时间为:12 PM、01 AM .. 11 PM。
time_select 'game', 'game_time', {:ampm => true}
http://api.rubyonrails.org/classes/ActionView/Helpers/DateHelper.html#method-i-time_select
我不知道您想要什么的内置助手。我建议你建立一个,并分享它!您可能也不希望下拉列表中的第一项是上午 12 点,因此这应该是一个配置选项。
此外,如果 12am 是 0 或 24 也应该是可配置的。
这是使用 vanilla 的基础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
我刚刚遇到了同样的问题,我看到了这个帖子,所以我想我会给出我的答案:
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..23 转换为标准 12am、1am、2am..10pm、11pm。
这很适合我的情况——我通常只是选择小时——但我承认这并不理想,因为小时中的上午/下午会下降。
= 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
}
出于这种目的,我建议使用 jQuery UI。它对用户更友好