オブジェクトのコピー
何かのmodelを関連model含めてそっくりそのままコピーしたい!ってときに便利なgemがdeep_cloneableです。
使い方はまとめてくださってる方がいるのでこちらを参考に。
簡単に説明すると
1.routeにget :copyを追加
2.controllerにcopyメソッド追加
3.viewにcopyアクションへのリンク追加
これで簡単にオブジェクトのコピーが作成されます。
1つ問題点がある
このgem、すごく便利なことはお分かりいただけたと思うんですが、1つ欠点があります。
それはCarrierWaveで保存された画像は複製されないということ。
厳密に言うとコピーはされるんですが、画像としてコピーされないんです。
何かの記事を書いていて、その画像も使いまわしたいときにいちいち「コピー→記事編集で画像投稿し直し」はやりたくないですね。
解決策
copyメソッドに少し手を加えます。
def copy
@sample = Sample.find(id: params[:id])
@copy = @sample.deep_clone(include: [:records])
@copy.image = @sample.image.file
@copy.save
respond_to do |format|
format.html { redirect_to root_path, notice: 'コピーしました。' }
end
end
重要なのは3行目ですね。
@sample.imageのままでは画像のURLそのものは取得できません。
@sample.image.fileとすることでURLのみを抽出し、コピー側へ渡し上書き保存させます。
これで画像まで含めた記事を丸々コピーできるようになりました。
2行目にinclude: [:records]がありますがこちらは子モデルも一緒にコピーしたいときに追加してください。
お役に立てたら幸いです!