Rails: записи HABTM не удаляются соответствующим образом - PullRequest
0 голосов
/ 25 марта 2010

Я выполняю работы по техническому обслуживанию на существующем сайте rails и столкнулся со странной ошибкой. Здесь задействовано несколько разных моделей: Registrations, Business Categories и Services. Registrations HABTM Business Categories и Services, каждый из которых HABTM Registrations. Соответствующие таблицы соединений без первичного ключа существуют для каждого из отношений HABTM.

Существует одна форма с двумя разделами (один для бизнес-категорий и один для услуг), которые пользователи заполняют для обновления своих регистраций. Каждый из двух разделов состоит из множества флажков, по одному для каждой потенциальной бизнес-категории и по одному для каждой услуги. Например, HAML, который генерирует флажки бизнес-категории, выглядит следующим образом:

    - BusinessCategory.find(:all, :order => ['business_type']).each do |business_category|
      %li
        = check_box_tag "registration[business_category_ids][]", business_category.id, (@registration.business_categories.include?(business_category)) ? true : false
        = business_category.business_type

В функции обновления контроллера Registrations:

  @registration = current_user.registration
  if @registration.update_attributes(params[:registration])
    flash[:notice] = "Company Successfully Updated."
    redirect_to :action => 'edit_company'
  else
    ... do appropriate error reporting and redirection ...

В общем все отлично работает. Пользователи могут зарегистрироваться с таким количеством или несколькими флажками, которые они хотят, и их бизнес-категории и службы регистрации отражают флажки. Последующие модификации также работают, по большей части. Однако, если в любой момент пользователи отменяют выбор всех полей в заданной части (категории или службы) формы, ни одно из изменений в этой части формы не сохраняется. Сообщения об ошибках отсутствуют, и по-прежнему отображается флеш-сообщение «Компания успешно обновлена», но флажки остаются установленными, даже если они не были проверены до отправки формы.

Если бы я перестраивал / реорганизовывал сайт, я бы с большей вероятностью использовал has_many :through, а не HABTM, но наш бюджет не дает мне достаточно времени для этого. У кого-нибудь есть идеи о том, почему HABTM, похоже, испытывает проблемы с отпуском?

Спасибо за внимание!

Justin

1 Ответ

0 голосов
/ 25 марта 2010

Если флажок не установлен, браузер ничего не отправляет для этого поля. Rails обходит это, добавляя скрытое поле с тем же именем, что и у флажка. Затем Rails вернет либо одно скрытое поле (флажок снят), либо оба поля (флажок установлен). Суть в том, что это не работает для массивов полей флажков. Я не в курсе моего HAML, но думаю, что это ваша проблема, и если флажок не установлен, в хеше params нет ключа :registration, поэтому ничего не обновляется.

См. API ref .

...