Pergunta

Eu tenho um trilhos formulário com um campo datetime_select. Quando tento enviar o formulário, recebo a seguinte exceção:

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

Se é um erro de validação, por que eu não vejo um erro na página?

Este é no Rails 2.0.2

Foi útil?

Solução

Acontece que Rails usa algo chamado Multi-parâmetro de atribuição para datas de transmissão e tempos em pequenas peças que são remontados quando você params atribuir à instância do modelo.

Meu problema era que eu estava usando um campo de formulário datetime_select para um campo de modelo de data. Aparentemente engasga quando as tentativas mágicas multi-parâmetro para definir o tempo em um objeto Date.

A solução foi usar um campo de formulário date_select em vez de um datetime_select.

Outras dicas

Super cortar, mas eu precisava para resolver este problema imediatamente para um projeto cliente. É ainda um bug com Rails 2.3.5.

Usando qualquer date_select ou datetime_select, se você adicionar isso ao seu modelo no método initialize, você pode pré-analisar os atributos serializado de forma passados ??para fazê-lo funcionar:

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

Eu estou usando isso com uma aninhada, polimórfica, modelo. Eis uma pergunta que eu tinha mostrando os modelos que estou usando . Então eu precisava accepts_nested_attributes_for com uma data e hora.

Aqui está a entrada e saída usando o 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

Caso contrário, ele era ou nulo, ou ele jogaria o erro:

1 error(s) on assignment of multiparameter attributes

Espero que ajude, Lance

Este não é um bug no Rails, é o comportamento pretendido do escritor atributo multi-parâmetro. Eu estou disposto a apostar que o campo deliver_date do cartaz original no banco de dados é um varchar em oposição a uma data ou datetime tipo. ActiveRecord usa cada parte do atributo multi-parâmetro para enviar para o novo método do tipo serializado. O número 1, 2, 3, etc indica a posição parâmetro de construtor eo "i" diz ActiveRecord para chamar to_i no parâmetro antes de passá-lo para o construtor. Neste caso, eles são todos "i do", porque DateTime.new (ano, mês, dia) espera três inteiros não três cordas.

Se a coluna deliver_date no banco de dados não é um tipo que é serializado para um DateTime em seguida, ActiveRecord irá lançar uma exceção ActiveRecord :: MultiparameterAssignmentErrors porque String.new (2010,2,11) não será bem sucedido.

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

ActiveRecord lança a exceção MultiparameterAssignmentErrors quando você tentar definir uma data inválida para um atributo de modelos.

Tente escolher uma data 31 de novembro do date_select ou datetime_select suspensa e você irá obter este erro.

Como Zubin Eu vi essa exceção quando o formulário apresenta um mês como um nome do mês, em vez de uma string mês numérica (ex. Outubro, em vez de 10).

Um agente de usuário que eu encontrei parece apresentar os conteúdos da tag opção em vez do atributo de valor:

Mozilla / 5.0 (SymbianOS / 9.2; U; Series60 / 3.1 NokiaE66-1 / 300.21.012; Perfil / MIDP-2.0 Configuração / CLDC-1.1) AppleWebKit / 413 (KHTML, como gecko) Safari / 413

Assim, no caso de apresentar uma data de multi-parâmetro de um ajudante gerado select (de date_select helper) seus parâmetros terá:

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

Isso cria uma exceção: ActiveRecord :: MultiparameterAssignmentErrors: 1 erro (s) na atribuição de multiparâmetros atributos

A maioria dos agentes de utilizador irão apresentar corretamente:

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

Este erro também pode ocorrer com webrat / pepino ao preencher os dados do formulário usando uma tabela.

por exemplo, isso não 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        |

mas isso faz:

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    |

No meu caso o ActiveRecord am / pm plug-in causou o erro através de um alias_method_chain incorreta, resultando em uma exceção StackLevelTooDeep.

O plugin foi incluída pelo plugin unobtrusive_date_picker.

O olhar para isso antes de mexer.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top