概要
- ここを読んで、どうやって実装するかわからず、ネットの情報もぼんやりとしていたので、書いてみました。。
- carrierwaveを使った画像アップロードとフォーム→確認画面→送信の画面遷移を想定したときに、一度アップロードした画像のキャッシュを活用すればOK
環境
- local の開発環境
- DBはsqlite
- cacheは
public/tmp/
に配置 - carrierwaveは1.3.1
- railsは5.2.2
その前に
- ざっくりとしか試していません。
- 関連するところしか記述していないです。適宜おぎなってください。
方法
ポイントとなるメソッド
- cache_name
- retrieve_from_cache!
- xxx_cache (この名前は何でも良いと思う)
コード
主要な箇所のみソースコード書きます。
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は