سؤال

لدي نموذج Rails مع حقل datetime_select.عندما أحاول إرسال النموذج، أحصل على الاستثناء التالي:

ActiveRecord::MultiparameterAssignmentErrors in WidgetsController#update 
1 error(s) on assignment of multiparameter attributes

إذا كان خطأ في التحقق من الصحة، فلماذا لا أرى خطأ في الصفحة؟

هذا في ريلز 2.0.2

هل كانت مفيدة؟

المحلول

اتضح أن Rails تستخدم شيئًا يسمى تعيين متعدد المعلمات لنقل التواريخ والأوقات في أجزاء صغيرة يتم إعادة تجميعها عند تعيين معلمات لمثيل النموذج.

كانت مشكلتي أنني كنت أستخدم حقل نموذج datetime_select لحقل نموذج التاريخ.يبدو أنه يختنق عندما يحاول السحر متعدد المعلمات ضبط الوقت على كائن التاريخ.

وكان الحل هو استخدام أ date_select حقل النموذج بدلاً من a datetime_select.

نصائح أخرى

اختراق رائع، ولكنني كنت بحاجة إلى حل هذه المشكلة على الفور لمشروع العميل.لا يزال هناك خطأ في Rails 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

أتمنى أن يساعد ذلك يا لانس

هذا ليس خطأً في ريلز، بل هو السلوك المقصود لكاتب السمات متعددة المعلمات.أنا على استعداد للمراهنة على أن حقل Delivery_date الخاص بالملصق الأصلي في قاعدة البيانات هو varchar بدلاً من نوع التاريخ أو التاريخ.يستخدم ActiveRecord كل جزء من سمة المعلمات المتعددة لإرساله إلى الطريقة الجديدة للنوع المتسلسل.يشير الرقم 1، 2، 3، وما إلى ذلك إلى موضع معلمة المُنشئ ويخبر "i" ActiveRecord باستدعاء to_i على المعلمة قبل تمريرها إلى المُنشئ.في هذه الحالة، تكون جميعها "i" لأن DateTime.new(year,month,day) يتوقع ثلاثة أعداد صحيحة وليس ثلاث سلاسل.

إذا لم يكن عمود Delivery_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

يطرح ActiveRecord استثناء MultiparameterAssignmentErrors عندما تحاول تعيين تاريخ غير صالح لسمة النماذج.

حاول اختيار تاريخ 31 نوفمبر من القائمة المنسدلة date_select أو datetime_select وسوف تحصل على هذا الخطأ.

مثل Zubin، رأيت هذا الاستثناء عندما يرسل النموذج شهرًا كاسم شهر بدلاً من سلسلة شهر رقمية (على سبيل المثال.أكتوبر بدلاً من 10).

يبدو أن وكيل المستخدم الذي واجهته يرسل محتويات علامة الخيار بدلاً من سمة القيمة:

موزيلا/5.0 (سيمبيان أو إس/9.2؛ش؛Series60/3.1 NokiaE66-1/300.21.012;ملف التعريف/midp-2.0 التكوين/CLDC-1.1) AppleWebkit/413 (KHTML ، مثل Gecko) Safari/413

لذا، في حالة إرسال تاريخ متعدد المعلمات من مساعد تم إنشاؤه، حدد (من date_select helper) سيكون لدى المعلمات الخاصة بك:

"event"=> {
    "start_on(2i)"=>"October",
    "start_on(3i)"=>"19",
    "start_on(1i)"=>"2010"
}

يؤدي هذا إلى إنشاء استثناء: ActiveRecord::أخطاء تعيين المعلمات المتعددة: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 مع الإسناد
لا تنتمي إلى StackOverflow
scroll top