1
0

More than 3 years have passed since last update.

CarrierWave使ったオブジェクトのコピー

Last updated at Posted at 2019-10-18

オブジェクトのコピー

何かの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]がありますがこちらは子モデルも一緒にコピーしたいときに追加してください。

お役に立てたら幸いです!

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0