Pregunta

Tengo un formulario Rails con un campo datetime_select.Cuando intento enviar el formulario, aparece la siguiente excepción:

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

Si es un error de validación, ¿por qué no veo un error en la página?

Esto está en Rails 2.0.2

¿Fue útil?

Solución

Resulta que Rails usa algo llamado asignación de parámetros múltiples para transmitir fechas y horas en partes pequeñas que se vuelven a ensamblar cuando asigna parámetros a la instancia del modelo.

Mi problema era que estaba usando un campo de formulario datetime_select para un campo de modelo de fecha.Aparentemente se ahoga cuando la magia multiparamétrica intenta establecer la hora en un objeto Fecha.

La solución fue utilizar un date_select campo de formulario en lugar de un datetime_select.

Otros consejos

Súper truco, pero necesitaba resolver este problema de inmediato para el proyecto de un cliente.Sigue siendo un error con Rails 2.3.5.

Usando cualquiera de los dos date_select o datetime_select, si agrega esto a su modelo en el initialize método, puede analizar previamente los atributos serializados del formulario pasados ​​para que funcione:

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

Estoy usando esto con un modelo polimórfico anidado. Aquí hay una pregunta que tenía mostrando los modelos que estoy usando..Entonces necesitaba accepts_nested_attributes_for con una fecha y hora.

Aquí está la entrada y salida usando la consola:

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

De lo contrario, sería nulo o arrojaría el error:

1 error(s) on assignment of multiparameter attributes

Espero que eso ayude, Lance

Esto no es un error en Rails, es el comportamiento previsto del escritor de atributos multiparámetro.Estoy dispuesto a apostar que el campo delivery_date del cartel original en la base de datos es un varchar en lugar de un tipo de fecha o fecha y hora.ActiveRecord utiliza cada parte del atributo multiparámetro para enviar al nuevo método del tipo serializado.El número 1, 2, 3, etc. indica la posición del parámetro del constructor y la "i" le dice a ActiveRecord que llame a to_i en el parámetro antes de pasarlo al constructor.En este caso, todas son "i" porque DateTime.new(año, mes, día) espera tres números enteros, no tres cadenas.

Si la columna delivery_date en la base de datos no es un tipo serializado a DateTime, ActiveRecord generará una excepción ActiveRecord::MultiparameterAssignmentErrors porque String.new(2010,2,11) no tendrá éxito.

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

ActiveRecord genera la excepción MultiparameterAssignmentErrors cuando intenta establecer una fecha no válida para un atributo de modelos.

Intente elegir una fecha del 31 de noviembre en el menú desplegable date_select o datetime_select y obtendrá este error.

Al igual que Zubin, he visto esta excepción cuando el formulario envía un mes como un nombre de mes en lugar de una cadena de mes numérica (por ejemplo,Octubre en lugar del 10).

Un agente de usuario que encontré parece enviar el contenido de la etiqueta de opción en lugar del atributo de valor:

Mozilla/5.0 (SymbianOS/9.2;Ud;Serie60/3.1 NokiaE66-1/300.21.012;Perfil/MIDP-2.0 Configuración/CLDC-1.1) AppleWebkit/413 (KHTML, como gecko) Safari/413

Entonces, en el caso de enviar una fecha de múltiples parámetros desde una selección generada por el asistente (desde el asistente date_select), sus parámetros tendrán:

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

Esto crea una excepción: ActiveRecord::Errores de asignación de parámetros múltiples:1 error(es) en la asignación de atributos multiparamétricos

La mayoría de los agentes de usuario enviarán correctamente:

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

Este error también puede ocurrir con webrat/pepino al completar datos del formulario usando una tabla.

por ejemplo, esto no funciona:

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        |

pero esto hace:

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    |

En mi caso, el complemento ActiveRecord am/pm causó el error a través de un error alias_method_chain resultando en un StackLevelTooDeep excepción.

El complemento fue incluido por el complemento unobtrusive_date_picker.

Mire esto antes de piratearlo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top