ActiveRecord :: MultiparameterAssignmentErrors是什么意思?
我有一个带有datetime_select字段的rails表单。 当我尝试提交表单时,我得到以下exception:
ActiveRecord::MultiparameterAssignmentErrors in WidgetsController#update 1 error(s) on assignment of multiparameter attributes
如果是validation错误,为什么我在页面上看不到错误?
这是在Rails 2.0.2中
事实certificate,rails使用称为多参数分配的东西来传输日期和时间,这些小部件在将params分配给模型实例时重新组装。
我的问题是我在日期模型字段中使用datetime_select表单字段。 当多参数魔法试图在Date对象上设置时间时,它显然会窒息。
解决方案是使用date_select
表单字段而不是datetime_select
。
超级黑客,但我需要立即解决这个问题的客户端项目。 它仍然是Rails 2.3.5的一个错误。
使用date_select
或datetime_select
,如果在initialize
方法中将其添加到模型中,则可以预先解析传递的form-serialized属性以使其工作:
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
和datetime。
这是使用控制台的输入和输出:
e = Event.last => # 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 => [#] >> e.model_surveys.last.deliver_date.class => ActiveSupport::TimeWithZone
否则它是null,否则会抛出错误:
1 error(s) on assignment of multiparameter attributes
希望有所帮助,兰斯
这不是Rails中的错误,它是多参数属性编写器的预期行为。 我愿意打赌,数据库中原始海报的deliver_date字段是一个varchar,而不是日期或日期时间类型。 ActiveRecord使用多参数属性的每个部分发送到序列化类型的新方法。 数字1,2,3等表示构造函数参数位置,“i”告诉ActiveRecord在将参数传递给构造函数之前调用参数上的to_i。 在这种情况下,它们都是“我”,因为DateTime.new(年,月,日)需要三个整数而不是三个字符串。
如果数据库中的deliver_date列不是序列化为DateTime的类型,则ActiveRecord将抛出ActiveRecord :: MultiparameterAssignmentErrorsexception,因为String.new(2010,2,11)将不会成功。
资料来源: https : //github.com/rails/rails/blob/v3.0.4/activerecord/lib/active_record/base.rb#L1739
当您尝试将无效日期设置为models属性时,ActiveRecord会抛出MultiparameterAssignmentErrorsexception。
尝试从date_select或datetime_select下拉列表中选择11月31日的日期,您将收到此错误。
像Zubin一样,当表单提交月份作为月份名称而不是数字月份字符串(例如10月而不是10)时,我看到了这种exception。
我遇到的一个用户代理似乎提交了option标签的内容而不是value属性:
Mozilla / 5.0(SymbianOS / 9.2; U; Series60 / 3.1 NokiaE66-1 / 300.21.012; Profile / 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" }
这会创建一个exception: ActiveRecord :: MultiparameterAssignmentErrors:分配多参数属性时发生1个错误
大多数用户代理将正确提交:
"event"=> { "start_on(2i)"=>"10", "start_on(3i)"=>"19", "start_on(1i)"=>"2010" }
使用表填写表单数据时,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 |
在我的情况下,ActiveRecord am / pm插件通过不正确的alias_method_chain
导致错误,导致StackLevelTooDeep
exception。
该插件包含在unobtrusive_date_picker插件中。
在黑客攻击之前看看这个。