ActiveRecord :: MultiparameterAssignmentErrors是什么意思?

时间:2008-09-18 14:53:01

标签: ruby-on-rails forms datetime-select multiparameter

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

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

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

这是在Rails 2.0.2

7 个答案:

答案 0 :(得分:11)

事实证明,当你将params分配给模型实例时,rails使用一种称为多参数赋值的东西来传输重新组装的小部件中的日期和时间。

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

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

答案 1 :(得分:5)

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

使用date_selectdatetime_select,如果您在initialize方法中将其添加到模型中,则可以预先解析传递的表单序列化属性以使其正常工作:< / p>

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

我使用嵌套的多态模型。 Here's a question I had showing the models I'm using。所以我需要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 error(s) on assignment of multiparameter attributes

希望有所帮助, 兰斯

答案 2 :(得分:3)

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

如果数据库中的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

答案 3 :(得分:2)

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

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

答案 4 :(得分:1)

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

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

  

Mozilla / 5.0(SymbianOS / 9.2; U;   Series60 / 3.1 NokiaE66-1 / 300.21.012;   资料/ MIDP-2.0   配置/ CLDC-1.1)   AppleWebKit / 413(KHTML,和Gecko一样)   的Safari / 413

因此,如果从助手生成的select(from date_select helper)中提交多参数日期,则params将具有:

"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"
}

答案 5 :(得分: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    |

答案 6 :(得分:0)

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

该插件包含在unobtrusive_date_picker插件中。

在黑客攻击之前看看这个。