Rails アプリの Pages には次のモデルがあります。
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
ページとそのブロックとコンテンツを複製する必要があります。DB にこれらのレコードの新しいバージョンを実際に作成するのと同じように、すべての関連付けはそのままです! ページへの関連付けを複製するために Amoeba gem を使用しています。また、PageTemplate と BlockTemplate を参照していることもわかります。テンプレート自体は複製されるべきではありませんが、外部キーによる参照は複製されるべきです。そのため、include_association に Block と Content のみを指定しているのです。
ただし、ブレークポイントを に配置すると@branch
、すべてのデータがあるように見えますが、ID がないため、リダイレクトは失敗します。適切に複製されていないため、ID がありません...理由はありますか?
ページ、ブロック、およびコンテンツのコピーを作成する必要があります。
clone
のような方法を試してみましたが、パラメーターが0clone: [:blocks, :contents]
のエラーが発生しました...clone
次を使用して、手動で目的を達成できます。
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