0

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
4

1 に答える 1