Rails - Как управлять вложенными атрибутами, не используя accepts_nested_attributes_for?

Моя проблема в том, что яМы столкнулись с ограничениями метода acceptpts_nested_attributes_for, поэтому мне нужно выяснить, как реплицировать эту функцию самостоятельно, чтобы обеспечить большую гибкость. (Смотрите ниже, что именноменя вешает.)Итак, мой вопрос: как должна выглядеть моя форма, контроллер и модели, если я хочу имитировать и увеличивать accepts_nested_attributes_for? Реальный трюк в том, что мне нужно иметь возможность обновлять как существующие, так и новые модели с существующими ассоциациями / атрибутами.

Я создаю приложение, которое использует вложенные формы. Первоначально я использовал этот RailsCast как проект (используя accepts_nested_attributes_for):Railscast 196: вложенная модельная форма.

Мое приложение - это контрольные списки с заданиями (заданиями), и яПозволяет пользователю обновлять контрольный список (имя, описание) и добавлять / удалять связанные задания в единой форме. Это хорошо работает, но я сталкиваюсь с проблемами, когда я включаю это в другой аспект моего приложения: историю через управление версиями.

Большая часть моего приложения заключается в том, что мне нужно записывать историческую информацию для моих моделей и ассоциаций. Я закончил тем, что катил свои собственные версии (Вот Это мой вопрос, в котором я описываю процесс принятия решений / соображения), и большая часть этого - рабочий процесс, в котором мне нужно создать новую версию старой вещи, внести изменения в новую версию, заархивировать старую версию. Это невидимо для пользователя, который воспринимает это как простое обновление модели через пользовательский интерфейс.

Код - модели

#checklist.rb
class Checklist < ActiveRecord::Base
  has_many :jobs, :through => :checklists_jobs
  accepts_nested_attributes_for :jobs, :reject_if => lambda { |a| a[:name].blank? }, :allow_destroy => true
end

#job.rb
class Job < ActiveRecord::Base
  has_many :checklists, :through => :checklists_jobs
end

Код - текущая форма (ПРИМЕЧАНИЕ: @jobs определяется как неархивированные задания для этого контрольного списка в действии редактирования контроллера контрольных списков; как и @checklist)

 { :class => 'form-inline' } do |f| %>
  
     Checklist<br>

     { :rows => 1 }, :placeholder => 'Name the Checklist...', :class => 'autoresizer'  %>
     { :rows => 3 }, :placeholder => 'Optional description...', :class => 'autoresizer' %>

    Jobs on this Checklist - [Name] [Description]

     { :class => 'form-inline' } do |j| %>
         j %>
    
    <br>
    <p></p>

    
       'btn btn-primary' %>
       'btn' %>
    
  

Код - фрагмент из checklists_controller.rb # Обновление

def update
  @oldChecklist = Checklist.find(params[:id])

# Do some checks to determine if we need to do the new copy/archive stuff
  @newChecklist = @oldChecklist.dup
  @newChecklist.parent_id = (@oldChecklist.parent_id == 0) ? @oldChecklist.id : @oldChecklist.parent_id
  @newChecklist.predecessor_id = @oldChecklist.id
  @newChecklist.version = (@oldChecklist.version + 1)
  @newChecklist.save

# Now I've got a new checklist that looks like the old one (with some updated versioning info).

# For the jobs associated with the old checklist, do some similar archiving and creating new versions IN THE JOIN TABLE
  @oldChecklist.checklists_jobs.archived_state(:false).each do |u|
    x = u.dup
    x.checklist_id = @newChecklist.id
    x.save
    u.archive
    u.save
  end

# Now the new checklist's join table entries look like the old checklist's entries did
# BEFORE the form was submitted; but I want to update the NEW Checklist so it reflects 
# the updates made in the form that was submitted.
# Part of the params[:checklist] has is "jobs_attributes", which is handled by
# accepts_nested_attributes_for. The problem is I can't really manipulate that hash very
# well, and I can't do a direct update with those attributes on my NEW model (as I'm 
# trying in the next line) due to a built-in limitation.
  @newChecklist.update_attributes(params[:checklist])

И этогде я сталкиваюсь с ограничением acceptpts_nested_attributes_for (это 'хорошо документированыВот, Я получаюне мог»найти Model1 с ID = X для Model2 с ID = Y " Исключение, которое в основном как-разработано.

Итак, как я могу создать несколько вложенных моделей и добавить / удалить их в родительской модели »Форма схожа с тем, что принимает accept_nested_attributes_for, но самостоятельно?

Варианты явидел - один из них лучше?Суть в том, что мне нужно иметь возможность обновлять как существующие, так и новые модели с существующими ассоциациями / атрибутами. Я могу'связать их, поэтому яЯ просто назову их.

Redtape (на github) Виртус (также github)

Спасибо за вашу помощь!

Ответы на вопрос(2)

Ваш ответ на вопрос