2008-09-18 2 views
14

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

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

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

Это в Rails 2.0.2

ответ

10

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

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

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

2

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

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

0

Эта ошибка также может возникать при использовании 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 | 
5

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

Я использую это с вложенная, полиморфная модель. Here's a question I had showing the models I'm using. Поэтому мне понадобилось 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

Надежда, что помогает, Копье

+0

Спасибо, что действительно спасли день. Система - очень старый портал, который все еще работает на rails 2.1.0 и не может быть обновлен, потому что даже рельсы исправлены/взломаны, а покрытие для тестирования похоже на 0, поэтому это действительно стало удобным. Также добавлено количество хаков, необходимых для его продолжения :) – 2010-11-29 05:46:08

0

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

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

Взгляните на это перед взломом.

1

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

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

Mozilla/5.0 (SymbianOS/9.2; U; Series60/3.1 NokiaE66-1/300.21.012; Profile/MIDP-2.0 Configuration/CLDC-1.1) AppleWebKit/413 (KHTML, like Gecko) Safari/413

Таким образом, в случае подачи даты многопараметрической от помощника генерироваться выберите (от date_select помощника) ваш 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" 
} 
3

Это не ошибка в 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

Смежные вопросы