ActiveRecord :: MultiparameterAssignmentErrors是什么意思?
我有一个带有datetime_select字段的rails表单。当我尝试提交表单时,出现以下异常:
ActiveRecord::MultiparameterAssignmentErrors in WidgetsController#update 1 error(s) on assignment of multiparameter attributes
如果这是验证错误,为什么我看不到页面上的错误?
这是在Rails 2.0.2中
解决方案
事实证明,rails使用一种称为"多参数分配"的方式来传输小部分中的日期和时间,这些小部分在为模型实例分配参数时会重新组装。
我的问题是我将datetime_select表单字段用于日期模型字段。当多参数魔术试图在Date对象上设置时间时,它显然会窒息。
解决方案是使用" date_select"表单字段,而不是" datetime_select"。
当我们尝试为模型属性设置无效的日期时,ActiveRecord会引发MultiparameterAssignmentErrors异常。
尝试从date_select或者datetime_select下拉列表中选择11月31日,我们将收到此错误。
使用表格填写表单数据时,webrat /黄瓜也可能发生此错误。
例如,这不起作用:
When I fill in the following: | report_from_1i | 2010 | | report_from_2i | January | | report_from_3i | 1 | | report_to_1i | 2010 | | report_to_2i | February | | report_to_3i | 1 |
但这确实是:
When I fill in the following: | report_from_1i | 2010 | | report_from_2i | 1 | | report_from_3i | 1 | | report_to_1i | 2010 | | report_to_2i | 2 | | report_to_3i | 1 |
超级黑客,但我需要立即为客户项目解决此问题。 Rails 2.3.5仍然是一个错误。
使用" date_select"或者" datetime_select",如果我们通过" initialize"方法将其添加到模型中,则可以预先解析所传递的表单序列化属性以使其起作用:
def initialize(attributes={}) date_hack(attributes, "deliver_date") super(attributes) end def date_hack(attributes, property) keys, values = [], [] attributes.each_key {|k| keys << k if k =~ /#{property}/ }.sort keys.each { |k| values << attributes[k]; attributes.delete(k); } attributes[property] = values.join("-") end
我将其与嵌套的多态模型一起使用。这是我向我展示正在使用的模型的一个问题。所以我需要带有日期时间的accepts_nested_attributes_for
。
这是使用控制台的输入和输出:
e = Event.last => #<Event id: 1052158304 ...> e.model_surveys => [] e.model_surveys_attributes = [{"survey_id"=>"864743981", "deliver_date(1i)"=>"2010", "deliver_date(2i)"=>"2", "deliver_date(3i)"=>"11"}] PRE ATTRIBUTES: {"survey_id"=>"864743981", "deliver_date(1i)"=>"2010", "deliver_date(2i)"=>"2", "deliver_date(3i)"=>"11"} # run date_hack POST ATTRIBUTES: {"survey_id"=>"864743981", "deliver_date"=>"2010-2-11"} e.model_surveys => [#<ModelSurvey id: 121, ..., deliver_date: "2010-02-11 05:00:00">] >> e.model_surveys.last.deliver_date.class => ActiveSupport::TimeWithZone
否则它为null,否则将引发错误:
在分配多参数属性时出现1个错误
希望能有所帮助,
槊
在我的案例中,ActiveRecord的am / pm插件是通过不正确的alias_method_chain
导致错误的,从而导致了" StackLevelTooDeep"异常。
该插件包含在unobtrusive_date_picker插件中。
在入侵之前先对此进行研究。
像Zubin一样,当表单提交月份作为月份名称而不是数字月份字符串(例如,十月而不是10)时,我也看到了这种例外。
我遇到的一个用户代理似乎提交了选项标签的内容,而不是value属性:
Mozilla/5.0 (SymbianOS/9.2; U; Series60/3.1 NokiaE66-1/300.21.012; Profile/MIDP-2.0 Configuration/CLDC-1.1 ) AppleWebKit/413 (KHTML, like Gecko) Safari/413
因此,如果要从助手生成的select(来自date_select助手)提交多参数日期,则参数将具有:
"event"=> { "start_on(2i)"=>"October", "start_on(3i)"=>"19", "start_on(1i)"=>"2010" }
这将创建一个异常:ActiveRecord :: MultiparameterAssignmentErrors:多参数属性分配时出现1个错误
大多数用户代理将正确提交:
"event"=> { "start_on(2i)"=>"10", "start_on(3i)"=>"19", "start_on(1i)"=>"2010" }