Взглянув на параметры в вашей трассировке, я думаю, что форма может быть в некотором роде неправильной, но трудно сказать, как без немного дополнительной информации. Параметры, которые вы получаете из формы прямо сейчас (переформатированы для разборчивости):
{ "commit" => "Send message",
"_method" => "put",
"machine_enquiry" => {
"messages_attributes" => {
"message" => "2",
"title" => "1",
"message_type_id" => "1",
"contact_detail_ids" => [ "1", "11" ]
}
},
"id" => "2",
"datetime" => ""
}
Но они должны выглядеть примерно так:
{ "commit" => "Send message",
"_method" => "put",
"machine_enquiry" => {
"messages_attributes" => {
0 => {
"message" => "2", # this may still be wrong
"title" => "1",
"message_type_id" => "1",
"contact_detail_ids" => [ "1", "11" ]
}
}
},
"id" => "2",
"datetime" => ""
}
Обратите внимание, что хеш, который был непосредственно внутри messages_attributes
, теперь стал глубже. Раздел вложенных атрибутов формы должен содержать хеш с уникальным ключом для каждого сообщения, которое создается или редактируется. Источником ошибки было то, что анализатор формата формы рассматривал message
, title
, message_id
и contact_detail_ids
как уникальные ключи для четырех отдельных сообщений, но значения, связанные с этими ключами, не были хешами, как и ожидалось.
Строка, которую я назвал с комментарием в исправленном примере, в которой я немного не уверен. Не видя форму целиком или класс Message
, трудно понять, является ли это атрибутом сообщения, или, возможно, это должен быть идентификатор сообщения. Кстати, идентификатор сообщения должен быть включен, только если вы редактируете существующее сообщение.
Имеется исчерпывающее объяснение микро-формата форм Rails . Выполните поиск has_many
, чтобы найти соответствующий раздел.
Источник этого неверно отформатированного хэша params почти наверняка ваш form_for
. Если вы включите его полностью, кто-то может помочь вам диагностировать, почему форма создается неправильно.
Обновлено
После просмотра полной формы проблема заключается в следующей строке:
<% me_form.fields_for :messages_attributes do |f| %>
Следует читать:
<% me_form.fields_for :messages do |f| %>
Помощник fields_for
ожидает имя ассоциации, чтобы действовать правильно. Еще одна проблема, которую я увидел при просмотре формы, заключается в том, что переключатели, которые вы используете для контактов, должны также изменить name
на что-то вроде machine_enquiry[messages_attributes][0][contact_detail_ids][]
. Вероятно, вам нужно будет найти способ сгенерировать эти переключатели с помощью помощника по форме, чтобы они могли получить правильный идентификатор сообщения.