문제

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 플러그인에 포함되었습니다.

해킹하기 전에 이것에 대해 살펴보십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top