вложенная форма, создание и обновление новых связанных моделей без перезагрузки страницы - PullRequest
1 голос
/ 16 октября 2010

Соответствующая информация

  • У меня есть модель 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. Есть предложения?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...