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

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top