[英]Rails ActiveRecord::MultiparameterAssignmentErrors
[英]What Does ActiveRecord::MultiparameterAssignmentErrors Mean?
我有一個帶有datetime_select字段的rails表單。 當我嘗試提交表單時,我得到以下異常:
ActiveRecord::MultiparameterAssignmentErrors in WidgetsController#update
1 error(s) on assignment of multiparameter attributes
如果是驗證錯誤,為什么我在頁面上看不到錯誤?
這是在Rails 2.0.2中
事實證明,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
=> #<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
希望有所幫助,蘭斯
這不是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
當您嘗試將無效日期設置為models屬性時,ActiveRecord會引發MultiparameterAssignmentErrors異常。
嘗試從date_select或datetime_select下拉列表中選擇11月31日的日期,您將收到此錯誤。
和Zubin一樣,當表單提交月份作為月份名稱而不是數字月份字符串(例如10月而不是10)時,我看到了這種異常。
我遇到的一個用戶代理似乎提交了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"
}
這會創建一個異常: 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
異常。
該插件包含在unobtrusive_date_picker插件中。
在黑客攻擊之前看看這個。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.