ActiveRecord :: MultiparameterAssignmentErrors是什么意思?

时间:2020-03-06 14:21:44  来源:igfitidea点击:

我有一个带有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"
}