为一个属性使用多个输入字段

时间:2012-06-21 17:59:28

标签: ruby-on-rails datetime datepicker

我是铁杆的新手,很抱歉,如果这个太容易了。

我的模型中有一个datetime属性,我尝试使用3个表单元素将值放入其中。 第一个是日期,是一个输入形式(我使用bootstrap-datepicker-rails,我想坚持下去)。在第二个我想要一个小时的选择框,第三个是分钟。

所以我看到我可以使用DateHelpers datetime_select但是我再也不能使用bootstrap-datepicker了。 那么通过使用多个表单输入元素来填充属性(日期时间)的正确方法是什么。我看到有类似assign_multiparameter_attributes但文档没有帮助: - (

由于

1 个答案:

答案 0 :(得分:10)

对我来说,这似乎是控制器要解决的问题。该模型仍然有效,如果它以“Rails”方式接收其属性,则可以正常工作。我的解决方案涉及控制器修改params哈希,以便模型甚至不知道视图中的更改。这取决于可被视为私有API的behavior in ActiveRecord,因此......公平警告: - )

假设你有这个型号:

# app/models/example.rb
class Example < ActiveRecord::Base
  attr_accessible :started_at    # this is a DateTime
end

调整视图,使用普通text_field_tag作为日期部分(将由bootstrap-datepicker增强)和Rails的time_select作为时间部分:

# app/views/examples/_form.html.erb
<%= form_for(@example) do |f| %>
  <p>
    <%= f.label :started_at %>
    <%= text_field_tag :started_at, @example.started_at.try(:to_date) %>
    <%= f.time_select :started_at, :ignore_date => true %>
  </p>

  <p><%= f.submit %></p>
<% 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属性。

您需要进行一些错误检查和验证,但这应该适合您。

相关问题