Использование 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