LoginSignup
12
12

More than 3 years have passed since last update.

【個人メモ】carrierwaveでcacheを取り回す

Last updated at Posted at 2019-05-14

概要

  • ここを読んで、どうやって実装するかわからず、ネットの情報もぼんやりとしていたので、書いてみました。。
  • carrierwaveを使った画像アップロードとフォーム→確認画面→送信の画面遷移を想定したときに、一度アップロードした画像のキャッシュを活用すればOK

環境

  • local の開発環境
  • DBはsqlite
  • cacheは public/tmp/ に配置
  • carrierwaveは1.3.1
  • railsは5.2.2

その前に

  • ざっくりとしか試していません。
  • 関連するところしか記述していないです。適宜おぎなってください。

方法

ポイントとなるメソッド

コード

主要な箇所のみソースコード書きます。

uploader/image_uploader.rb
class ImageUploader < CarrierWave::Uploader::Base
 # 省略
end
models/user.rb
class User
  attr_accessor :image_cache
  mount_uploader :image, ImageUploader
end
controllers/users_controller.rb
class UsersController
  def new
    @user = User.new
  end
  def confirm
    @user = current_user.users.new(user_params)
    # フォームからimageが渡されなかったとき(=変更がなかったとき)にcahceから復元するところがポイント
    if !@user.image.present?
      @user.image.retrieve_from_cache! @user.image_cache
    end
    @user.image_cache = @user.image.cache_name
    # 省略
  end
  def create
    @user = current_user.users.new(user_params)
    @user.image.retrieve_from_cache! @user.image_cache # cache nameを渡して、imageを復元するところ
    # 省略
  end

  def user_params
    params.require(:user).permit(:image, :image_cache)
  end
end
new.html.erb
// 適当にconfirmアクションににアクセスできるようにm、 routes.rbを定義してください。
<%= form_with @user, url: user_confirm_path, local: true do |f| %>
  <%= f.file_field %>
  <%= f.hidden_field :image_cache %>
<%= f.submit %>
confirm.html.erb
<%= form_with @user, url: users_path, local: true do |f| %>
  <%= f.hidden_field :image_cache %>
<%= f.submit %>

ポイント

cache nameを渡して、imageを復元するところと、フォームからimageが渡されなかったとき(=変更がなかったとき)にcahceから復元するところがポイント
* cache_name これで、cache fileのidを取得
* retrieve_from_cache! 上記cache fileを imageに復元する

その他

  • cacheは
12
12
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
12
12