使用日期和时间表单帮助方法

你可以选择不使用生成 HTML5 日期和时间输入框的帮助方法,而使用生成日期和时间选择列表的帮助方法。生成日期和时间选择列表的帮助方法和其他表单帮助方法有两个重要的不同点:

  • 日期和时间不在单个 input 元素中输入,而是每个时间单位都有各自的元素,因此在 params 中就没有单个值能表示完整的日期和时间;
  • 其他帮助方法通过 _tag 后缀区分是独立的帮助方法还是操作模型对象的帮助方法。对日期和时间帮助方法来说,select_dateselect_time 和 select_datetime 是独立的帮助方法,date_selecttime_select 和 datetime_select 是相应的操作模型对象的帮助方法。

这两类帮助方法都会为每个时间单位(年,月,日等)生成各自的选择列表。

4.1 独立的帮助方法

select_* 这类帮助方法的第一个参数是 DateTime 或 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_yearselect_monthselect_dayselect_hourselect_minuteselect_second。各帮助方法的作用一目了然。默认情况下,这些帮助方法创建的选择列表 name 属性都跟时间单位的名称一样,例如,select_year 方法创建的 select 元素 name 属性值为 yearselect_month 方法创建的 select 元素 name 属性值为 month,不过也可使用 :field_name 选项指定其他值。:prefix 选项的作用与在 select_date 和 select_time 方法中一样,且默认值也一样。

这些帮助方法的第一个参数指定选中哪个值,可以是 DateTime 或 DateTime 类的实例(会从实例中获取对应的值),也可以是数字。例如:

<%= select_year( 2009 ) %>
<%= select_year( Time .now) %>

如果今年是 2009 年,那么上述两种用法生成的 HTML 是一样的。用户选择的值可以通过 params[:date][:year] 获取。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值