15

我有一个带有 datetime_select 字段的 rails 表单。当我尝试提交表单时,出现以下异常:

ActiveRecord::MultiparameterAssignmentErrors in WidgetsController#update 
1 error(s) on assignment of multiparameter attributes

如果是验证错误,为什么我在页面上看不到错误?

这是在 Rails 2.0.2 中

4

7 回答 7

11

事实证明,rails 使用称为多参数分配的东西来传输小部分的日期和时间,当您将参数分配给模型实例时,这些小部分会重新组合。

我的问题是我使用 datetime_select 表单字段作为日期模型字段。当多参数魔法试图在 Date 对象上设置时间时,它显然会窒息。

解决方案是使用date_select表单字段而不是datetime_select.

于 2008-09-18T14:57:42.030 回答
5

超级黑客,但我需要立即为客户项目解决这个问题。它仍然是 Rails 2.3.5 的一个错误。

使用date_selector 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

否则它要么为空,要么会抛出错误:

1 error(s) on assignment of multiparameter attributes

希望有帮助,兰斯

于 2010-02-11T18:08:30.377 回答
3

这不是 Rails 中的错误,它是多参数属性编写器的预期行为。我敢打赌,数据库中原始发帖人的 Deliver_date 字段是 varchar,而不是 date 或 datetime 类型。ActiveRecord 使用多参数属性的每一部分发送给序列化类型的新方法。数字 1、2、3 等表示构造函数参数位置,“i”告诉 ActiveRecord 在将参数传递给构造函数之前调用 to_i 参数。在这种情况下,它们都是“i”,因为 DateTime.new(year, month, day) 需要三个整数而不是三个字符串。

如果数据库中的 Deliver_date 列不是序列化为 DateTime 的类型,则 ActiveRecord 将抛出 ActiveRecord::MultiparameterAssignmentErrors 异常,因为 String.new(2010,2,11) 不会成功。

来源: https ://github.com/rails/rails/blob/v3.0.4/activerecord/lib/active_record/base.rb#L1739

于 2011-02-11T01:46:52.660 回答
2

当您尝试为模型属性设置无效日期时,ActiveRecord 会引发 MultiparameterAssignmentErrors 异常。

尝试从 date_select 或 datetime_select 下拉列表中选择 11 月 31 日的日期,您将收到此错误。

于 2009-12-09T04:39:34.603 回答
1

像 Zubin 一样,当表单提交月份作为月份名称而不是数字月份字符串(例如,十月而不是 10)时,我已经看到了这个异常。

我遇到的一个用户代理似乎提交了选项标签的内容而不是值属性:

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

因此,在从助手生成的选择(来自 date_select 助手)提交多参数日期的情况下,您的参数将具有:

"event"=> {
    "start_on(2i)"=>"October",
    "start_on(3i)"=>"19",
    "start_on(1i)"=>"2010"
}

这会产生一个异常:ActiveRecord::MultiparameterAssignmentErrors: 1 error(s) on assignment of multiparameter attributes

大多数用户代理会正确提交:

"event"=> {
    "start_on(2i)"=>"10",
    "start_on(3i)"=>"19",
    "start_on(1i)"=>"2010"
}
于 2010-10-17T09:50:21.240 回答
0

使用表格填写表单数据时,webrat/cucumber 也会出现此错误。

例如,这不起作用:

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    |
于 2010-02-08T20:48:47.403 回答
0

在我的情况下,ActiveRecord am/pm 插件通过错误导致错误alias_method_chain导致StackLevelTooDeep异常。

该插件包含在 unobtrusive_date_picker 插件中。

在破解之前对此进行调查。

于 2010-05-04T13:49:36.170 回答