Frage

Ich habe eine Schiene mit einem datetime_select Feld bilden. Wenn ich versuche, das Formular abzuschicken, ich die folgende Ausnahme erhalten:

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

Wenn es ein Fehler bei der Überprüfung ist, warum ich nicht einen Fehler auf der Seite sehen?

Dies ist in Rails 2.0.2

War es hilfreich?

Lösung

Es stellt sich heraus, dass Schienen verwenden etwas Multi-Parameter-Zuweisung genannt Datums- und Uhrzeitangaben in kleinen Teilen zu übertragen, die zusammengesetzt werden, wenn Sie params zum Modell Instanz zuweisen.

Mein Problem war, dass ich ein datetime_select Formularfeld für ein Datum Modellfeld wurde mit. Es Drosseln offenbar, wenn die Multi-Parameter-Magie der Zeit auf einem Date-Objekt zu setzen versucht.

Die Lösung wurde ein date_select Formularfeld zu verwenden, anstatt ein datetime_select.

Andere Tipps

Super Hack, aber ich brauchte dieses Problem sofort für ein Client-Projekt zu lösen. Es ist immer noch ein Problem mit Rails 2.3.5.

entweder date_select oder datetime_select verwenden, wenn Sie diese zu Ihrem Modell in der initialize Methode hinzufügen, können Sie die übergebenen form serialisiert Attribute vorab analysieren, damit es funktioniert:

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

Ich verwende diese mit einem verschachtelten, polymorphen, Modell. Hier ist eine Frage, die ich die Modelle zeigen, hatte ich verwende . Also brauchte ich accepts_nested_attributes_for mit einem Datetime.

Hier ist die Ein- und Ausgabe über die Konsole:

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

Ansonsten war es entweder null oder es würde den Fehler aus:

1 error(s) on assignment of multiparameter attributes

Ich hoffe, das hilft, Lance

Dies ist kein Fehler in Rails ist das beabsichtigte Verhalten des Multi-Parameter-Attribut Schreiber. Ich bin bereit zu wetten, dass das deliver_date Feld der Original-Poster in der Datenbank ein varchar als auf ein Datum oder Datetime-Typen entgegengesetzt ist. Active verwendet, jeden Teil des Attributs Multiparameter an das neue Verfahren des serialisierten Typs zu senden. Die Zahl 1, 2, 3, usw. zeigt die Konstruktorparameter Position und der „i“ sagt Active auf dem Parameter zu nennen to_i bevor es an den Konstruktor. In diesem Fall sind sie alle „i ist“, weil DateTime.new (Jahr, Monat, Tag) erwartet drei ganze Zahlen nicht drei Strings.

Wenn die deliver_date Spalte in der Datenbank kein Typ ist, der zu einem DateTime- serialisiert ist, dann wird Active ein Active werfen :: MultiparameterAssignmentErrors Ausnahme, weil String.new (2010,2,11) wird nicht erfolgreich sein.

Quelle: https://github.com/rails /rails/blob/v3.0.4/activerecord/lib/active_record/base.rb#L1739

Active führt die MultiparameterAssignmentErrors Ausnahme, wenn Sie versuchen, ein ungültiges Datum einzustellen, um ein Modell zuschreiben.

Versuchen Sie, ein 31. November Datum aus dem date_select oder datetime_select Dropdown-Liste auswählen und Sie werden diesen Fehler erhalten.

Wie Zubin ich diese Ausnahme gesehen habe, wenn das Formular einen Monat als Monatsnamen trägt statt einem numerischen Monat Zeichenfolge (z. Oktober statt 10).

Ein User-Agent die ich gestoßen bin scheint den Inhalt der Option Tag einreichen eher als der Wert Attribut:

  

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

So im Falle eines Multiparameter-Datum von einem Helfer Vorlage erzeugt select (von date_select Helfer) Ihre params haben:

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

Dies erzeugt eine Ausnahme: Active :: MultiparameterAssignmentErrors: 1 Fehler (n) auf Zuweisung von Multiparameter-Attribute

Die meisten User-Agents korrekt einreichen:

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

Dieser Fehler kann auch mit webrat / Gurke auftreten, wenn in Formulardaten mit Hilfe einer Tabelle zu füllen.

zB dies nicht funktioniert:

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        |

, aber das bedeutet:

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    |

In meinem Fall der Active am / pm-Plugin des Fehler durch eine falsche alias_method_chain was zu einer StackLevelTooDeep Ausnahme verursacht hat.

Das Plugin durch das unobtrusive_date_picker Plugin enthalten war.

Der Blick in das vor hacken.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top