Ruby on rails 为一个属性使用多个输入字段
我是rails新手,如果这个太简单了,我很抱歉 我的模型中有一个datetime属性,我尝试用3个表单元素将值放入其中。 第一个是日期,是一个输入表单(我使用bootstrapdatepickerrails,我希望继续使用它)。在第二个框中,我想要一个小时选择框,第三个框是分钟选择框 所以我看到我可以使用DateHelpers datetime\u select,但是我不能再使用bootstrap datepicker了。 那么,通过使用多个表单输入元素来填充属性(datetime)的正确方法是什么呢。我看到了类似于assign_multiparameter_attributes的东西,但是doc没有太大帮助:-(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”中接收其属性,则可以正常工作方法。我的解决方案涉及控制器修改
参数
散列,以便模型甚至不知道视图中的更改。这取决于可以将其视为私有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