Соответствующая информация
- У меня есть модель User с множеством атрибутов и несколько has_many ассоциаций.
- У меня есть БОЛЬШАЯ форма для редактирования существующей пользовательской информации, включая вложенные поля.
- Я разделил форму на несколько форм в разных элементах div и показываю только одну форму одновременно. (т.е. вкладки в пользовательском интерфейсе)
- Пользователь может сохранить информацию, нажав кнопку Сохранить, которая передает видимую в данный момент часть формы через Ajax. Нет перезагрузки страницы. Просто обновите окно статуса с помощью rjs.
- Я использую Пример Райана Бейтса для динамического добавления полей для вложенных моделей.
Задача
Если пользователь добавляет поля для связанных моделей, используя js
и отправляет форму n раз
создано n новых связанных моделей
это происходит потому, что в полях, добавленных в js, нет атрибута hidden_field для атрибута id и каждый раз при отправке формы параметры не содержат идентификатор для этой конкретной вложенной записи. то есть в первый раз все в порядке, после второго запроса поста Ajax (напоминание - страница не перезагружается) эту запись следует обновить, но вместо этого создается новая запись, поскольку для этой уже существующей записи не было передано ни одного параметра id.
Вопрос
Должен ли я делать грязные хаки в контроллере, чтобы узнать, должны ли новые записи быть сохранены, и если они есть - обновить динамически добавленную форму в представлении, добавив скрытое поле с недавно сохраненным значением id записи. Вопрос в том, как сделать это аккуратно, написав максимально поддерживаемый и надежный код из возможных?
На данный момент действия по обновлению невероятно просты, с комментариями о грязных взломах
def update
@user = current_user
respond_to do |wants|
wants.js {
#analyze parameters to find out which
#nested model is going to be saved (not updated)?
#also save identifier of nested record in view i.e. {...."324324234" => {:a => 1, :b => 2, .... etc}}
@user.update_attributes(params[:user])
# check if the record of the model was saved and take it's id;
# use identifier 324324234 to find nested form and insert hidden
# field with record id using rjs
}
end
end
Надеюсь, я четко определил свою проблему. Я действительно хотел бы избежать таких взломов и написать красивый код. Я также не хотел бы перезагрузить страницу или ее часть с помощью ajax. Есть предложения?