什么Email::MultiparameterAssignmentErrors的意思吗?
-
01-07-2019 - |
题
我有一个轨的形式与datetime_select领域。当我试图提交的形式,我得到以下例外:
ActiveRecord::MultiparameterAssignmentErrors in WidgetsController#update
1 error(s) on assignment of multiparameter attributes
如果它是一个验证的错误,为什么不要我看到一个错误的页面?
这是在轨2.0.2
解决方案
事实证明,轨道使用一种叫做多参数分配到发射日期和时间,小部分是重新组装时分配参数模型的实例。
我的问题是,我使用一个datetime_select形式领域的日期模式的领域。它显然呛当多的参数的魔法试图设定的时间约会的对象。
解决的办法是使用一个 date_select
形式领域,而不是一个 datetime_select
.
其他提示
超级破解的,但我需要了解决这个问题对一个客户的项目。它仍然是一个错误与轨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
否则,它是空的,或者它将把错误:
1 error(s) on assignment of multiparameter attributes
希望这有帮助, Lance
这是不是一个错误在轨道,它是打算行为的多参属性的作家。我愿意打赌,原来的海报的deliver_date领域的数据库是一个varchar作为反对一个日期或时间类型。Email使用的每个部分的多参属送到新的方法的序列化的类型。数1,2,3,等表示构造参数的位置和"我",告诉Email叫to_i上的参数之前通过它的构造。在这种情况下,他们都是"我的",因为DateTime。新的(年、月、日)预计三个整数而不是三个字符串。
如果deliver_date列的数据库并不是一类型的化为DateTime然后Email会扔Email::MultiparameterAssignmentErrors例外情况,因为串。新的(2010,2,11)不会成功。
资料来源:https://github.com/rails/rails/blob/v3.0.4/activerecord/lib/active_record/base.rb#L1739
Email投MultiparameterAssignmentErrors例外时,试图设置的无效日期为模型的属性。
尝试挑选一个月31日期从date_select或datetime_select拉和您将得到这一错误。
像是祖宾我已经看到这种异常形式提交一个月一个月的名称,而不是数个月string(eg.日而不是10).
一个用户代理我们所遇到的似乎提交内容的选项的标签,而不是值属性:
Mozilla/5.0(SymbianOS/9.2;U;Series60/3.1NokiaE66-的1/300.21.012;个人/实-2.0 结构/CLDC-1.1) AppleWebKit/413(KHTML,像只壁虎) Safari/413
所以在该情况下提出多参数的日期从一个辅助生成的选择(从date_select助手)你params将有:
"event"=> {
"start_on(2i)"=>"October",
"start_on(3i)"=>"19",
"start_on(1i)"=>"2010"
}
这将创建一个例外: Email::MultiparameterAssignmentErrors:1错误(s)在分配的多参数的属性
大多数用户代理人将正确地提交:
"event"=> {
"start_on(2i)"=>"10",
"start_on(3i)"=>"19",
"start_on(1i)"=>"2010"
}
这个错误,也可能发生与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 |
在我的情况的Email am/pm插件引起的误差通过一个错误 alias_method_chain
导致一个 StackLevelTooDeep
例外。
插件,包括通过unobtrusive_date_picker插件。
看起来到这之前,黑客离开。