ActiveRecord::MultiparameterAssignmentErrors는 무엇을 의미합니까?
-
01-07-2019 - |
문제
datetime_select 필드가 있는 레일스 양식이 있습니다.양식을 제출하려고 하면 다음 예외가 발생합니다.
ActiveRecord::MultiparameterAssignmentErrors in WidgetsController#update
1 error(s) on assignment of multiparameter attributes
유효성 검사 오류인 경우 페이지에 오류가 표시되지 않는 이유는 무엇입니까?
이것은 Rails 2.0.2에 있습니다.
해결책
레일은 다중 매개변수 할당이라는 것을 사용하여 모델 인스턴스에 매개변수를 할당할 때 다시 조립되는 작은 부품으로 날짜와 시간을 전송하는 것으로 나타났습니다.
내 문제는 날짜 모델 필드에 datetime_select 양식 필드를 사용하고 있다는 것입니다.다중 매개변수 마법이 Date 객체에 시간을 설정하려고 시도하면 분명히 질식합니다.
해결책은 date_select
양식 필드가 아닌 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
그렇지 않으면 null이거나 오류가 발생합니다.
1 error(s) on assignment of multiparameter attributes
도움이되기를 바랍니다
이것은 Rails의 버그가 아니며 다중 매개변수 속성 작성기의 의도된 동작입니다.데이터베이스에 있는 원본 포스터의 Deliver_date 필드는 날짜 또는 날짜/시간 유형이 아닌 varchar일 것이라고 확신합니다.ActiveRecord는 다중 매개변수 속성의 각 부분을 사용하여 직렬화된 유형의 새 메소드로 보냅니다.숫자 1, 2, 3 등은 생성자 매개변수 위치를 나타내며 "i"는 매개변수를 생성자에 전달하기 전에 매개변수에 대해 to_i를 호출하도록 ActiveRecord에 지시합니다.이 경우 DateTime.new(년, 월, 일)는 세 개의 문자열이 아닌 세 개의 정수를 기대하기 때문에 모두 "i"입니다.
데이터베이스의 Deliver_date 열이 DateTime으로 직렬화된 유형이 아닌 경우 String.new(2010,2,11)가 성공하지 못하기 때문에 ActiveRecord는 ActiveRecord::MultiparameterAssignmentErrors 예외를 발생시킵니다.
원천:https://github.com/rails/rails/blob/v3.0.4/activerecord/lib/active_record/base.rb#L1739
모델 속성에 잘못된 날짜를 설정하려고 하면 ActiveRecord에서 MultiparameterAssignmentErrors 예외가 발생합니다.
date_select 또는 datetime_select 드롭다운에서 11월 31일 날짜를 선택하려고 하면 이 오류가 발생합니다.
Zubin과 마찬가지로 양식이 숫자로 된 월 문자열이 아닌 월 이름으로 월을 제출할 때 이 예외를 보았습니다(예:10월이 아닌 10월).
내가 만난 한 사용자 에이전트는 value 속성이 아닌 옵션 태그의 내용을 제출하는 것 같습니다.
모질라/5.0(심비안OS/9.2;유;시리즈60/3.1 NokiaE66-1/300.21.012;프로파일/MIDP-2.0 구성/CLDC-1.1) AppleWebkit/413 (Gecko와 같은 KHTML) Safari/413
따라서 생성된 도우미(date_select 도우미에서)에서 다중 매개변수 날짜를 제출하는 경우 매개변수는 다음과 같습니다.
"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 플러그인에 포함되었습니다.
해킹하기 전에 이것에 대해 살펴보십시오.