Что означает ActiveRecord :: MultiparameterAssignmentErrors? - PullRequest
15 голосов
/ 18 сентября 2008

У меня есть форма рельсов с полем datetime_select. Когда я пытаюсь отправить форму, я получаю следующее исключение:

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

Если это ошибка проверки, почему я не вижу ошибку на странице?

Это в Rails 2.0.2

Ответы [ 7 ]

11 голосов
/ 18 сентября 2008

Оказывается, что рельсы используют то, что называется многопараметрическим назначением, для передачи дат и времени в небольших частях, которые повторно собираются при назначении параметров экземпляру модели.

Моя проблема заключалась в том, что я использовал поле формы datetime_select для поля модели даты. Очевидно, он задыхается, когда магия с несколькими параметрами пытается установить время для объекта Date.

Решением было использование поля формы date_select вместо datetime_select.

5 голосов
/ 11 февраля 2010

Супер хак, но мне нужно было сразу решить эту проблему для клиентского проекта. Это все еще ошибка в 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

Надеюсь, это поможет, Lance

3 голосов
/ 11 февраля 2011

Это не ошибка в Rails, это предполагаемое поведение средства записи многопараметрических атрибутов. Я готов поспорить, что в поле базы данных оригинального постера delivery_date используется varchar, а не тип date или datetime. ActiveRecord использует каждую часть многопараметрического атрибута для отправки новому методу сериализованного типа. Число 1, 2, 3 и т. Д. Указывает положение параметра конструктора, а «i» указывает ActiveRecord вызвать to_i для параметра перед передачей его конструктору. В этом случае они все "я", потому что DateTime.new (год, месяц, день) ожидает три целых числа, а не три строки.

Если столбец 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

2 голосов
/ 09 декабря 2009

ActiveRecord выдает исключение MultiparameterAssignmentErrors, когда вы пытаетесь установить недопустимую дату для атрибута моделей.

Попробуйте выбрать дату 31 ноября из выпадающего списка date_select или datetime_select, и вы получите эту ошибку.

1 голос
/ 17 октября 2010

Как и Зубин, я видел это исключение, когда форма представляет месяц как имя месяца, а не числовую строку месяца (например, октябрь, а не 10).

Один пользовательский агент, с которым я столкнулся, передает содержимое тега option, а не атрибута value:

Mozilla / 5.0 (SymbianOS / 9.2; U; Series60 / 3.1 NokiaE66-1 / 300.21.012; Профиль / MIDP-2.0 Конфигурация / CLDC-1.1) AppleWebKit / 413 (KHTML, как Gecko) Safari / 413

Так что в случае отправки многопараметрической даты из сгенерированного помощника select (from date_select helper) ваши параметры будут иметь:

"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"
}
0 голосов
/ 04 мая 2010

В моем случае плагин ActiveRecord am / pm вызвал ошибку из-за неправильного alias_method_chain, что привело к исключению StackLevelTooDeep.

Плагин был включен плагином unobtrusive_date_picker.

Посмотрите на это, прежде чем взломать.

0 голосов
/ 08 февраля 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    |
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...