Использование Amoeba для копирования страницы с блоками и содержимым

У меня есть следующая модель для моих страниц в моем приложении rails:

class Page < ActiveRecord::Base

  has_many :blocks
  has_many :contents, :through => :blocks

  validates :title, presence: true
  validates :content, presence: true
  validates :page_template_id, presence: true

  amoeba do
    enable
    include_association :blocks
    include_association :contents
  end

  def create_branch
    branch = self.amoeba_dup #should dup content and blocks too
    branch.branched_from = self.id #so we know what record it was copied from
    branch.status = 0 #set this new copy to draft
    branch.save #save the branch
    branch #return the branch
  end

end

Таким образом, страница имеет блоки, а блоки имеют содержимое.

Модели для них следующие:

class Block < ActiveRecord::Base
  belongs_to :page
  belongs_to :block_template
  has_many :contents
  validates :title, presence: true
  validates :block_template_id, presence: true
  validates :page_id, presence: true
end

class Content < ActiveRecord::Base
  belongs_to :block
  validates :name, presence: true
  validates :content, presence: true
  validates :block_id, presence: true
end

Что я хочу сделать, это когда я вызываю это в моем контроллере:

  def branch
    @page = Page.find(params[:id])
    @branch = @page.create_branch
    redirect_to edit_page_path(@branch), :notice => 'Draft created!'
  end

Он должен дублировать страницу, ее блоки и содержимое. Как и при создании новых версий этих записей в БД, но со всеми связями в такте! Я использую драгоценный камень Amoeba, чтобы дублировать ассоциации к странице. Вы также можете видеть, что я ссылаюсь на PageTemplate и BlockTemplate. Сами шаблоны не должны дублироваться, но ссылки через внешний ключ должны быть, поэтому я указываю только Block и Content для include_association.

Однако, если я поставлю точку останова на @branchон, кажется, имеет все данные, но не имеет идентификатора, поэтому перенаправление завершается неудачно. У него нет идентификатора, потому что он не был должным образом продублирован... есть идеи, почему?

Следует создавать копии страницы, блоков и содержимого.

Я попробовал clone метод как clone: [:blocks, :contents] но это дало мне ошибку, clone принимает 0 параметров...


Я могу достичь того, что хочу вручную, используя:

def create_branch
  new_page = self.dup
  new_page.branched_from = self.id
  new_page.status = 0
  new_page.save
  # duplicate the blocks and contents
  self.blocks.each do |block|
    new_block = block.dup
    new_block.page_id = new_page.id
    new_block.save
    block.contents.each do |content|
      new_content = content.dup
      new_content.block_id = new_block.id
      new_content.save
    end
  end
  # finally return the new page
  new_page
end

1 ответ

Вы можете включить все необходимые параметры внутри блока, а для отношения Содержание вы можете создать его из класса Block следующим образом:

class Page < ActiveRecord::Base
  ...
  amoeba do
    include_association :blocks
    set :status => 0
    customize(lambda { |original_page, new_page|
      new_page.branched_from = original_page.id
    })
  end
  .....
  def create_branch 
    branch = self.amoeba_dup
    branch.save
    branch
  end
end

и при клонировании блока у нас будет код для клонирования содержимого:

class Block < ActiveRecord::Base
  .......
  amoeba do
    include_association :contents
    set :status => 0
    customize(lambda { |original_block, new_block|
      new_block.page_id = original_page.id
    })
  end
  ....... 
end

 class Content < ActiveRecord::Base
  ....... 
  amoeba do
    enable
  end
  ....... 
 end
Другие вопросы по тегам