簡體   English   中英

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_selectdatetime_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM