我有一个轨的形式与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_selectdatetime_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插件。

看起来到这之前,黑客离开。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top