Rails 3:如何编写与模型结构不完全一致的表单?



例如,如果我有一个具有名为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对象的时间组件。

  1. 我该如何构建表单代码?
  2. 在控制器中,我要如何组织发送到表单的数据?我想把时间对象的两个分量分开吗?

谢谢你的智慧!

我想这可能不是对你问题的直接回答,但可能提供一个很好的起点:

有一个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会自动将其放入日期时间。

相关内容

  • 没有找到相关文章