例如,如果我有一个具有名为start_time
的时间属性的简单模型,那么直接的表单代码将是…
<%= form_for newObj do |f| %>
<%= render 'shared/error_messages', :object => f.object %>
<div class="field">
<%= f.label :start_time %><br />
<%= f.text_field :start_time %>
</div>
<div class="actions">
<%= f.submit "Submit" %>
</div>
<% end %>
但是我想有两个文本字段,一个用于time
对象的日期组件,一个用于time
对象的时间组件。
- 我该如何构建表单代码?
- 在控制器中,我要如何组织发送到表单的数据?我想把时间对象的两个分量分开吗?
谢谢你的智慧!
我想这可能不是对你问题的直接回答,但可能提供一个很好的起点:
有一个Rails视图助手select_datetime
,它为日期和时间条目(而不是文本字段)生成下拉菜单。参见文档:http://api.rubyonrails.org/classes/ActionView/Helpers/DateHelper.html#method-i-select_datetime
Ryan Bates做了几个相关的铁路广播(链接到asciicast,应该包含原始视频的链接):
-
http://asciicasts.com/episodes/32-time-in-text-field这处理了上面提到的繁琐的下拉框,并通过使用文本字段代替。这里的代码可以帮助为日期和时间输入做两个单独的文本字段。
-
http://asciicasts.com/episodes/213-calendars这是关于javascript日历小部件的。
我们可以在这里使用虚拟属性
class YourModel < AR::Base
def start_time_ar=ar
start_time = DateTime.parse(ar.join(" "))
end
end
所以在你看来:
<%= form_for newObj do |f| %>
<%= render 'shared/error_messages', :object => f.object %>
<div class="field">
<%= f.label "Date" %>
<%= text_field_tag "#{f.object_name}[start_time_ar][]" %><br />
<%= f.label "Time" %>
<%= text_field_tag "#{f.object_name}[start_time_ar][]" %>
</div>
<div class="actions">
<%= f.submit "Submit" %>
</div>
<% end %>
我认为使用日历或datetime_select
助手是一个很好的方法,因为它可以消除一些输入的格式问题(世界各地的日期格式没有标准化,使用AM/PM或24H等)。
并且,分割它将允许您自动完成大部分工作。例如,你有你的:start_time
属性,然后你为start_time(1i)
创建一个字段,用于年份,start_time(2i)
用于月份,start_time(3i)
用于日期等,当传递给模型时,ActiveRecord会自动将其放入日期时间。