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

Ruby on rails 为一个属性使用多个输入字段,ruby-on-rails,datetime,datepicker,Ruby On Rails,Datetime,Datepicker,我是rails新手,如果这个太简单了,我很抱歉 我的模型中有一个datetime属性,我尝试用3个表单元素将值放入其中。 第一个是日期,是一个输入表单(我使用bootstrapdatepickerrails,我希望继续使用它)。在第二个框中,我想要一个小时选择框,第三个框是分钟选择框 所以我看到我可以使用DateHelpers datetime\u select,但是我不能再使用bootstrap datepicker了。 那么,通过使用多个表单输入元素来填充属性(datetime)的正确方法是

我是rails新手,如果这个太简单了,我很抱歉

我的模型中有一个datetime属性,我尝试用3个表单元素将值放入其中。 第一个是日期,是一个输入表单(我使用bootstrapdatepickerrails,我希望继续使用它)。在第二个框中,我想要一个小时选择框,第三个框是分钟选择框

所以我看到我可以使用DateHelpers datetime\u select,但是我不能再使用bootstrap datepicker了。 那么,通过使用多个表单输入元素来填充属性(datetime)的正确方法是什么呢。我看到了类似于assign_multiparameter_attributes的东西,但是doc没有太大帮助:-(


感谢我,这似乎是控制器需要解决的问题。该模型仍然有效,如果它在“Rails”中接收其属性,则可以正常工作方法。我的解决方案涉及控制器修改
参数
散列,以便模型甚至不知道视图中的更改。这取决于可以将其视为私有API,因此…公平警告:-)

假设您有此型号:

# app/models/example.rb
class Example < ActiveRecord::Base
  attr_accessible :started_at    # this is a DateTime
end
请注意,我们使用的是
try
,因为此表单将为新记录和持久记录呈现。这避免了当
start\u at
属性为
nil
时出现问题

然后在控制器中创建一个
before_过滤器
,以在发送到模型之前修改
参数
散列:

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
类示例控制器[:create,:update]
# ...
私有的
def fix_参数
date=date.parse(params.delete(:start_at))
参数[:示例]。合并!({
“开始时间(1i)”=>date.year.to\u,
“开始时间(2i)”=>date.month.to\u,
“开始时间(3i)”=>date.day.to\u
})
结束
结束
本质上,我们将
params[:start_at]
解析为日期,并将其分配给
params[:example]
的正确键。然后,当参数最终传递给模型时,ActiveRecord将正确分配模型的
start\u at
属性


您可能需要执行一些错误检查和验证,但这应该对您有用。

第一行“fix_params”应该有params[:example],否则它将为nil。事实并非如此。由于我使用的是
text\u field\u标记
而不是
f.text\u field
,因此文本字段的名称是
started\u at
,而不是
示例[started\u at]
。所以它确实存在于
params
hash的顶层。不过,我已经用f.text_字段实现了这种方法,而且效果很好。
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