Cosa significa ActiveRecord::MultiparameterAssignmentErrors?
-
01-07-2019 - |
Domanda
Ho un modulo ferroviario con un campo datetime_select.Quando provo a inviare il modulo, ottengo la seguente eccezione:
ActiveRecord::MultiparameterAssignmentErrors in WidgetsController#update
1 error(s) on assignment of multiparameter attributes
Se si tratta di un errore di convalida, perché non vedo un errore nella pagina?
Questo è in Rails 2.0.2
Soluzione
Si scopre che rails utilizza qualcosa chiamato assegnazione multiparametrica per trasmettere date e orari in piccole parti che vengono riassemblate quando si assegnano parametri all'istanza del modello.
Il mio problema era che stavo utilizzando un campo modulo datetime_select per un campo modello data.Apparentemente soffoca quando la magia multiparametrica tenta di impostare l'ora su un oggetto Date.
La soluzione era usare a date_select
campo modulo anziché a datetime_select
.
Altri suggerimenti
Super trucco, ma avevo bisogno di risolvere subito questo problema per un progetto cliente.È ancora un bug con Rails 2.3.5.
Usando entrambi date_select
O datetime_select
, se lo aggiungi al tuo modello nel file initialize
metodo, puoi pre-analizzare gli attributi serializzati del modulo passati per farlo funzionare:
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
Lo sto usando con un modello annidato e polimorfico. Ecco una domanda che ho avuto mostrando i modelli che sto utilizzando.Quindi avevo bisogno accepts_nested_attributes_for
con una data/ora.
Ecco l'input e l'output utilizzando la console:
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
Altrimenti sarebbe nullo o genererebbe l'errore:
1 error(s) on assignment of multiparameter attributes
Spero che questo aiuti, Lance
Questo non è un bug di Rails, è il comportamento previsto dello scrittore di attributi multiparametro.Sono disposto a scommettere che il campo deliver_date del poster originale nel database è un varchar anziché un tipo data o datetime.ActiveRecord utilizza ogni parte dell'attributo multiparametro per inviare al nuovo metodo del tipo serializzato.Il numero 1, 2, 3, ecc. indica la posizione del parametro del costruttore e la "i" indica ad ActiveRecord di chiamare to_i sul parametro prima di passarlo al costruttore.In questo caso sono tutte "i" perché DateTime.new(anno, mese, giorno) prevede tre numeri interi e non tre stringhe.
Se la colonna deliver_date nel database non è un tipo serializzato su DateTime, ActiveRecord genererà un'eccezione ActiveRecord::MultiparameterAssignmentErrors perché String.new(2010,2,11) non avrà esito positivo.
Fonte:https://github.com/rails/rails/blob/v3.0.4/activerecord/lib/active_record/base.rb#L1739
ActiveRecord genera l'eccezione MultiparameterAssignmentErrors quando si tenta di impostare una data non valida sull'attributo di un modello.
Prova a scegliere la data del 31 novembre dal menu a discesa date_select o datetime_select e otterrai questo errore.
Come Zubin, ho riscontrato questa eccezione quando il modulo invia un mese come nome del mese anziché come stringa numerica del mese (ad es.ottobre anziché il 10).
Un agente utente che ho incontrato sembra inviare il contenuto del tag opzione anziché l'attributo valore:
Mozilla/5.0 (SymbianOS/9.2;U;Serie60/3.1 NokiaE66-1/300.21.012;Profile/Midp-2.0 Configuration/CLDC-1.1) AppleWebKit/413 (KHTML, Like Gecko) Safari/413
Quindi, nel caso di invio di una data multiparametro da una selezione generata dall'helper (dall'helper date_select), i tuoi parametri avranno:
"event"=> {
"start_on(2i)"=>"October",
"start_on(3i)"=>"19",
"start_on(1i)"=>"2010"
}
Questo crea un'eccezione: ActiveRecord::Errori di assegnazione multiparametro:1 errore/i nell'assegnazione di attributi multiparametro
La maggior parte degli user agent invierà correttamente:
"event"=> {
"start_on(2i)"=>"10",
"start_on(3i)"=>"19",
"start_on(1i)"=>"2010"
}
Questo errore può verificarsi anche con webrat/cucumber durante la compilazione dei dati del modulo utilizzando una tabella.
ad esempio questo non funziona:
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 |
ma questo fa:
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 |
Nel mio caso il plug-in am/pm di ActiveRecord ha causato l'errore tramite un errore alias_method_chain
risultante in un StackLevelTooDeep
eccezione.
Il plugin è stato incluso dal plugin unobtrusive_date_picker.
Dai un'occhiata a questo prima di hackerare.