你可以选择不使用生成 HTML5 日期和时间输入框的帮助方法,而使用生成日期和时间选择列表的帮助方法。生成日期和时间选择列表的帮助方法和其他表单帮助方法有两个重要的不同点:
- 日期和时间不在单个
input
元素中输入,而是每个时间单位都有各自的元素,因此在params
中就没有单个值能表示完整的日期和时间; - 其他帮助方法通过
_tag
后缀区分是独立的帮助方法还是操作模型对象的帮助方法。对日期和时间帮助方法来说,select_date
、select_time
和select_datetime
是独立的帮助方法,date_select
、time_select
和datetime_select
是相应的操作模型对象的帮助方法。
这两类帮助方法都会为每个时间单位(年,月,日等)生成各自的选择列表。
4.1 独立的帮助方法
select_*
这类帮助方法的第一个参数是 Date
、Time
或 DateTime
类的实例,并选中指定的日期时间。如果不指定,就使用当前日期时间。例如:
<%=
select_date Date.today, prefix:
:start_date
%>
|
生成的 HTML 如下(为了行为简便,省略了各选项):
<
select
id
=
"start_date_year"
name
=
"start_date[year]"
> ... </
select
>
<
select
id
=
"start_date_month"
name
=
"start_date[month]"
> ... </
select
>
<
select
id
=
"start_date_day"
name
=
"start_date[day]"
> ... </
select
>
|
上面各控件会组成 params[:start_date]
,其中包含名为 :year
、:month
和 :day
的键。如果想获取 Time
或 Date
对象,要读取各时间单位的值,然后传入适当的构造方法中,例如:
Date.civil(params[
:start_date
][
:year
].to_i, params[
:start_date
][
:month
].to_i, params[
:start_date
][
:day
].to_i)
|
:prefix
选项的作用是指定从 params
中获取各时间组成部分的键名。在上例中,:prefix
选项的值是 start_date
。如果不指定这个选项,就是用默认值 date
。
4.2 处理模型对象的帮助方法
select_date
方法在更新或创建 Active Record 对象的表单中有点力不从心,因为 Active Record 期望 params
中的每个元素都对应一个属性。用于处理模型对象的日期和时间帮助方法会提交一个名字特殊的参数,Active Record 看到这个参数时就知道必须和其他参数结合起来传递给字段类型对应的构造方法。例如:
<%=
date_select
:person
,
:birth_date
%>
|
生成的 HTML 如下(为了行为简介,省略了各选项):
<
select
id
=
"person_birth_date_1i"
name
=
"person[birth_date(1i)]"
> ... </
select
>
<
select
id
=
"person_birth_date_2i"
name
=
"person[birth_date(2i)]"
> ... </
select
>
<
select
id
=
"person_birth_date_3i"
name
=
"person[birth_date(3i)]"
> ... </
select
>
|
创建的 params
Hash 如下:
{
'person'
=> {
'birth_date(1i)'
=>
'2008'
,
'birth_date(2i)'
=>
'11'
,
'birth_date(3i)'
=>
'22'
}}
|
传递给 Person.new
(或 update
)方法时,Active Record 知道这些参数应该结合在一起组成 birth_date
属性,使用括号中的信息决定传给 Date.civil
等方法的顺序。
4.3 通用选项
这两种帮助方法都使用同一组核心函数生成各选择列表,因此使用的选项基本一样。默认情况下,Rails 生成的年份列表包含本年前后五年。如果这个范围不能满足需求,可以使用 :start_year
和 :end_year
选项指定。更详细的可用选项列表请参阅 API 文档。
基本原则是,使用 date_select
方法处理模型对象,其他情况都使用 select_date
方法,例如在搜索表单中根据日期过滤搜索结果。
很多时候内置的日期选择列表不太智能,不能协助用户处理日期和星期几之间的对应关系。
4.4 单个时间单位选择列表
有时只需显示日期中的一部分,例如年份或月份。为此,Rails 提供了一系列帮助方法,分别用于创建各时间单位的选择列表:select_year
,select_month
,select_day
,select_hour
,select_minute
,select_second
。各帮助方法的作用一目了然。默认情况下,这些帮助方法创建的选择列表 name
属性都跟时间单位的名称一样,例如,select_year
方法创建的 select
元素 name
属性值为 year
,select_month
方法创建的 select
元素 name
属性值为 month
,不过也可使用 :field_name
选项指定其他值。:prefix
选项的作用与在 select_date
和 select_time
方法中一样,且默认值也一样。
这些帮助方法的第一个参数指定选中哪个值,可以是 Date
、Time
或 DateTime
类的实例(会从实例中获取对应的值),也可以是数字。例如:
<%=
select_year(
2009
)
%>
<%=
select_year(
Time
.now)
%>
|
如果今年是 2009 年,那么上述两种用法生成的 HTML 是一样的。用户选择的值可以通过 params[:date][:year]
获取。