为一个属性使用多个输入字段
我是铁杆的新手,很抱歉,如果这个太容易了。
我的模型中有一个datetime属性,我尝试用3个表单元素将值放入其中。 第一个是日期,是一个输入forms(我使用bootstrap-datepicker-rails,我想坚持下去)。 在第二个我想要一个小时的选择框,第三个是分钟。
所以我看到我可以使用DateHelpers datetime_select但是我再也不能使用bootstrap-datepicker了。 那么通过使用多个表单输入元素来填充属性(日期时间)的正确方法是什么。 我看到有类似assign_multiparameter_attributes但文档不太有帮助:-(
谢谢
对我来说,这似乎是控制器要解决的问题。 该模型仍然有效,如果它以“Rails”方式接收其属性,则可以正常工作。 我的解决方案涉及控制器修改params
散列,以便模型甚至不知道视图中的变化。 这取决于ActiveRecord中可能被视为私有API的行为,因此……公平警告:-)
假设你有这个型号:
# app/models/example.rb class Example < ActiveRecord::Base attr_accessible :started_at # this is a DateTime end
调整视图以使用普通的text_field_tag
作为日期部分(将由bootstrap- time_select
增强)和Rails的time_select
作为时间部分:
# app/views/examples/_form.html.erb <%= form_for(@example) do |f| %> <%= f.label :started_at %> <%= text_field_tag :started_at, @example.started_at.try(:to_date) %> <%= f.time_select :started_at, :ignore_date => true %>
<%= f.submit %>
<% end %>
请注意,我们正在使用try
因为此表单将针对新记录和持久记录进行呈现。 当started_at
属性为nil
时,这可以避免出现问题。
然后在控制器中创建一个before_filter
,在它被发送到模型之前修改params
哈希:
class ExamplesController < ApplicationController before_filter :fix_params, :only => [:create, :update] # ... private def fix_params date = Date.parse(params.delete(:started_at)) params[:example].merge!({ 'started_at(1i)' => date.year.to_s, 'started_at(2i)' => date.month.to_s, 'started_at(3i)' => date.day.to_s }) end end
基本上,我们将params[:started_at]
解析为日期并将其分配给params[:example]
的正确键。 然后,当参数最终传递给模型时,ActiveRecord将正确分配模型的started_at
属性。
您需要进行一些错误检查和validation,但这应该适合您。